Ich habe eine XML
mit zwei ListView
, eine mit einer Liste von Clients, die von einer ausgewählten Abfrage ( lv_cli
) gefüllt sind, und die andere mit den Details des ausgewählten Clients ( lv_cli_det
). Ich möchte den Kunden in der lv_cli
Zeit, in der lv_cli_det
die Details angezeigt werden, ausgewählt lassen .
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();
}
});
java
android
android-listview
Celta
quelle
quelle
Antworten:
Fügen Sie die folgende Zeile in das Layout Ihres Listenansichtselements ein, um die Farbe des Listenansichtselements beim Drücken beizubehalten:
android:background="@drawable/bg_key"
Dann definieren Sie
bg_key.xml
indrawable
Ordner wie folgt:<?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>
Fügen Sie dies schließlich in Ihre
ListView
onClickListener
:listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) { view.setSelected(true); ... // Anything } });
Auf diese Weise wird immer nur ein Element farblich ausgewählt. Sie können Ihre Farbwerte folgendermaßen definieren
res/values/colors.xml
:<?xml version="1.0" encoding="utf-8"?> <resources> <color name="pressed_color">#4d90fe</color> <color name="default_color">#ffffff</color> </resources>
quelle
Ich habe den richtigen Weg gefunden. Es ist sehr einfach. Beschreiben Sie in der Ressource Folgendes:
android:choiceMode="singleChoice" android:listSelector="#666666"
(oder Sie können einen Ressourcenlink anstelle eines Farbwerts angeben)
Programmatisch:
listView.setSelector(Drawable selector); listView.setSelector(int resourceId); listView.setChoiceMode(int mode);
Der Modus kann einer der folgenden sein: AbsListView.CHOICE_MODE_SINGLE, AbsListView.CHOICE_MODE_MULTIPLE, AbsListView.CHOICE_MODE_NONE (Standard)
(AbsListView ist der abstrakte Vorfahr für die ListView-Klasse)
PS-Manipulationen mit onItemClick und das Ändern des Ansichtshintergrunds sind bankrott, da eine Ansicht selbst ein temporäres Objekt ist. Daher dürfen Sie keine Ansicht verfolgen.
Wenn unsere Liste lang genug ist, werden die Ansichten, die mit ausgeblendeten Elementen verknüpft sind, aus der Hierarchie entfernt und neu erstellt, wenn diese Elemente erneut angezeigt werden (mit zwischengespeicherten Anzeigeoptionen, z. B. Hintergrund). Die von uns verfolgte Ansicht ist jetzt keine tatsächliche Ansicht des Elements, und das Ändern des Hintergrunds hat nichts mit der tatsächlichen Elementansicht zu tun. Als Ergebnis haben wir mehrere Elemente ausgewählt.
quelle
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); });
Vielleicht möchten Sie das aktuell ausgewählte Element mithilfe des Index i in einer globalen Variablen speichern.
quelle
Einfach ausgedrückt: Wenn Sie die Listenansicht in einer XML-Datei verwenden, verwenden Sie diese Attribute in Ihrer Listenansicht.
android:choiceMode="singleChoice" android:listSelector="#your color code"
Wenn Sie XML nicht verwenden, programmgesteuert
quelle
Sie benötigen einen Selektor wie folgt:
<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>
Und dann
android:choiceMode="singleChoice"
auf Ihre ListView setzen.quelle
android:listselector="@drawable/my_selector"
in Ihrer ListView!Aus dem Beispiel von Avinash Kumar Pankaj
dann bei oncreate Methode
v = new View(getActivity());
und dann onlistitemclick Methode, die ich geschrieben habe
public void onListItemClick(ListView listView, View view, int position, long id) { v.setBackgroundResource(0); view.setBackgroundResource(R.color.green); v = view; }
Es hat bei mir funktioniert. Vielen Dank.
ich ersetzte
v = new View(getActivity());
zu
v = new View(this);
und der Code funktionierte gut.
Es sind auch die XML-Dateien 'Farben' und 'bg_key' aus früheren Beispielen sowie das ListView-Attribut android erforderlich: background = "@ drawable / bg_key"
Mauro
quelle
* Bitte stellen Sie sicher, dass sich in Ihrem Stammlayout des Listenansichtscontainers keine Welligkeit befindet
Fügen Sie diese Zeile Ihrer Listenansicht hinzu
android:listSelector="@drawable/background_listview"
Hier ist die Datei "background_listview.xml"
<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>
die Farben, die in der Datei background_listview.xml verwendet wurden:
<color name="primary_color">#cc7e00</color> <color name="white_background">#ffffffff</color>
danach
quelle
Eine Möglichkeit, dies zu tun, besteht darin, die aktuell ausgewählte Position in Ihrer Aktivität zu verfolgen:
@Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { currentPosition = position lv_cli.notifyDataSetChanged(); }
Stellen Sie nun sicher, dass Sie dem übergeordneten Layout (linearLayout, boxLayout, relativeLayout usw.) Ihres Listenelements eine ID zuweisen.
Dann können Sie in Ihrer ListView Folgendes tun:
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); }
Grundsätzlich legen Sie die helle Farbe nur als Hintergrund für das Layout fest, wenn sie Ihrer aktuell ausgewählten Position entspricht. Beachten Sie, wie ich eine zeichnbare Hintergrundressource einstelle, wenn das Element nicht ausgewählt ist. Dies könnte in Ihrem Fall anders sein (da Sie keinen Code gepostet haben). In meinem Fall ist dieses Zeichenelement ein Wahlschalter, der sicherstellt, dass der Gegenstand beim Drücken gut beleuchtet ist.
quelle
Verwenden Sie stattdessen die ID:
Dies ist die einfachste Methode, die auch bei langen Listen ausgeführt werden kann:
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; }
Und dann in Ihrem 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(); .....
quelle