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();
}
});
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>
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.
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.
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);
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.
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
*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)
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.
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();
.....