Android ListView article sélectionné rester surligné

j'ai un XML avec deux ListView , l'un avec une liste de clients remplie par une requête select ( lv_cli ) et l'autre avec les coordonnées du client sélectionné ( lv_cli_det ). Je voudrais garder le client sélectionné dans le lv_cli pendant que le lv_cli_det montre les détails.

XML:

<ListView
    android:id="@+id/cli_lista"
    android:layout_width="512dp"
    android:layout_height="wrap_content"
    android:fadeScrollbars="false"
    >
</ListView>

<ListView
    android:id="@+id/cli_lista_det"
    android:layout_width="512dp"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/cli_lista"
    android:fadeScrollbars="false" >
</ListView>

Java:

Cursor cursor = db.rawQuery("Select NrCl||';'||Nome From Clientes", null);
final ListView t = (ListView)findViewById(R.id.cli_lista);
ArrayAdapter<String> myarrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, listItems);
t.setAdapter(myarrayAdapter);

final ListView td = (ListView)findViewById(R.id.cli_lista_detalhe);
final ArrayAdapter<String> myarrayAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, listItems2);

t.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String item = ((TextView)view).getText().toString();
        String[] strArray = item.split(";");

        cli.load(strArray[0].toString());
        td.setAdapter(myarrayAdapter2);
        listItems2.clear();
        listItems2.add("Nome: " + cli.getNome());
        listItems2.add("Morada: " + cli.getMorada());
        listItems2.add("Localidade: " + cli.getLoca());
        listItems2.add("Código Postal: " + cli.getCp());
        listItems2.add("Pais: " + cli.getPais());
        listItems2.add("Nif: " + cli.getNif());
        listItems2.add("Tel: " + cli.getTel());
        listItems2.add("Tlm: " + cli.getTlm());
        listItems2.add("Tipo Preço: " + cli.getTipoPvn());
        listItems2.add("Cond. Pagamento: " + cli.getCpg());
        listItems2.add("Obs: " + cli.getObs());
        td.setAdapter(myarrayAdapter2);
        myarrayAdapter2.notifyDataSetChanged(); 
    }
});
71
demandé sur M.G 2013-04-24 14:29:08

9 réponses

pour tenir la couleur de l'item listview lorsque vous appuyez dessus, incluez la ligne suivante dans la mise en page de l'item listview:

android:background="@drawable/bg_key"

puis Définir bg_key.xml dans drawable dossier comme ceci:

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:state_selected="true"
        android:drawable="@color/pressed_color"/>
    <item
        android:drawable="@color/default_color" />
</selector>

enfin, incluez ceci dans votre ListView onClickListener :

listView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
        view.setSelected(true);
        ... // Anything
    }
});

ainsi, un seul article sera sélectionné en couleur à tout moment. Vous pouvez définir vos valeurs de couleur dans res/values/colors.xml avec quelque chose comme ceci:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="pressed_color">#4d90fe</color>
    <color name="default_color">#ffffff</color>
</resources>
126
répondu Neoh 2017-05-04 15:04:21

trouvé le bon chemin. C'est très simple. Dans la ressource, décrivez ce qui suit:

android:choiceMode="singleChoice"
android:listSelector="#666666"

(ou vous pouvez spécifier un lien de Ressource au lieu de la valeur de couleur)

programmatique:

listView.setSelector(Drawable selector)
listView.setSelector(int resourceId)
listView.setChoiceMode(int mode)
Le mode

peut être L'un de ceux-ci: AbsListView.CHOICE_MODE_SINGLE, AbsListView.CHOICE_MODE_MULTIPLE, AbsListView.CHOICE_MODE_NONE (default)

(AbsListView est l'ancêtre abstrait de la classe ListView)

P. S. manipulations avec onItemClick et l'évolution de fond de la vue sont en faillite, parce que la vue elle-même est un objet temporaire. Par conséquent, vous ne devez pas suivre une vue.

si notre liste est assez longue, les vues associées aux éléments déroulés seront retirées de la hiérarchie, et seront recréées lorsque ces éléments seront affichés à nouveau (avec des options d'affichage en cache, comme l'arrière-plan). Donc, la vue que nous avons suivie n'est plus une vue réelle de l'article, et changer son arrière-plan ne fait rien à la vue d'objet réelle. En conséquence, nous avons plusieurs articles sélectionnés.

148
répondu AJG 2014-08-05 04:17:33
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            for (int j = 0; j < adapterView.getChildCount(); j++)
                adapterView.getChildAt(j).setBackgroundColor(Color.TRANSPARENT);

            // change the background color of the selected element
            view.setBackgroundColor(Color.LTGRAY);
});

peut-être voulez-vous sauvegarder l'élément courant sélectionné dans une variable globale en utilisant l'index I.

35
répondu Chris623 2013-11-26 10:23:22

de façon simpliste, si vous utilisez listview dans un xml,utilisez ces attributs dans votre listview,

android:choiceMode="singleChoice"
android:listSelector="#your color code"

si vous n'utilisez pas xml,en programmant

listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
listview.setSelector(android.R.color.holo_blue_light);
10
répondu Ashana.Jackol 2015-10-23 10:21:24

vous avez besoin d'un sélecteur comme ceci:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- State when a row is being pressed, but hasn't yet been activated (finger down) -->
<item android:drawable="@color/app_primary_color_light" android:state_pressed="true" />

<!-- Used when the view is "activated". -->
<item android:drawable="@color/app_primary_color" android:state_activated="true" />

<!-- Default, "just hangin' out" state. -->
<item android:drawable="@android:color/transparent" /></selector>

, puis android:choiceMode="singleChoice" dans votre ListView.

3
répondu Крум Илиев 2014-11-18 10:20:35

extrait de L'exemple D'Avinash Kumar Pankaj

View v;

puis à la méthode oncreate

v = new View(getActivity());

et puis méthode onlistitemclick j'ai écrit

public void onListItemClick(ListView listView, View view, int position,
       long id) {
   v.setBackgroundResource(0);
   view.setBackgroundResource(R.color.green);
   v = view;
}

ça a marché pour moi. Remercier.

j'ai remplacé

v = new View(getActivity());

à

v = new View(this);

et le code a bien fonctionné.

il est nécessaire les fichiers xml 'colors' et 'bg_key' des exemples précédents aussi, ainsi que L'attribut android de ListView: background= "@drawable/bg_key"

Mauro

2
répondu Mauro Simoes 2014-10-10 05:06:39

*s'il vous plaît assurez-vous qu'il n'y a pas D'Ondulation à votre disposition racine du conteneur de vue de liste

ajouter cette ligne à la vue de votre liste

android:listSelector="@drawable/background_listview"

, voici le "background_listview."fichier" xml 151940920"

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/white_background" android:state_pressed="true" />
<item android:drawable="@color/primary_color" android:state_focused="false" /></selector>

les couleurs utilisées dans le background_listview.fichier xml:

<color name="primary_color">#cc7e00</color>
<color name="white_background">#ffffffff</color>

après ces

(cliqué sur l'élément de contenir de couleur orange jusqu'à ce que vous cliquez sur un autre item)

2
répondu ShahinFasihi 2015-11-24 07:17:45

une façon de le faire, est de garder une trace de la position actuelle choisie dans votre activité:

@Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
            long arg3) {
        currentPosition = position
        lv_cli.notifyDataSetChanged();
    }

maintenant, assurez-vous d'assigner un ID au layout parent (linearLayout, boxLayout, relativeLayout,.. Tout ce que vous préférez) de votre article de liste.

alors dans votre ListView vous pouvez faire quelque chose comme ceci:

layoutBackground = (LinearLayout) convertView.findViewById(R.id.layout_background);

if (YourActivity.this.currentPosition == position) {
    layoutBackground.setBackgroundColor(YourActivity.this.getResources().getColor(R.color.hilight_color));
} else{
    layoutBackground.setBackgroundResource(R.drawable.list_item_drawable);
}

en gros, vous mettez juste la couleur de hilight à la disposition comme un fond quand il égale votre position sélectionnée. Remarquez comment j'ai défini une ressource d'arrière-plan dessinable lorsque l'élément n'est pas sélectionné. Cela pourrait être différent dans votre cas (puisque vous n'avez pas posté de code). Dans mon cas, ce drawable est un sélecteur qui s'assure que l'article est allumé lorsqu'il est pressé.

NOTE: ce code simple n'utilise pas de support de vue, mais je suis vraiment vous recommandons d'utiliser un.

1
répondu Tristan Vanderaerden 2016-05-30 11:56:59

utilisez l'id à la place:

c'est la méthode la plus facile à utiliser même si la liste est longue:

public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    Holder holder=new Holder();
    View rowView;
    rowView = inflater.inflate(R.layout.list_item, null);
    //Handle your items.
    //StringHolder.mSelectedItem is a public static variable.
    if(getItemId(position)==StringHolder.mSelectedItem){
        rowView.setBackgroundColor(Color.LTGRAY);

    }else{
        rowView.setBackgroundColor(Color.TRANSPARENT);
    }
    return rowView;
}

et ensuite dans votre onclicklistener:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            StringHolder.mSelectedItem = catagoryAdapter.getItemId(i-1);
            catagoryAdapter.notifyDataSetChanged();
.....
0
répondu Wasiun A. Khan 2016-06-29 07:32:45