Android ListView выбранный элемент остается выделенным
у меня есть XML С ListView, один со списком клиентов, заполненных select query (lv_cli) и другой с деталями выбранного клиента (lv_cli_det).
Я бы хотел, чтобы клиент был выбран в lv_cli С lv_cli_det показать детали.
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 ответов:
чтобы сохранить цвет элемента listview при его нажатии, включите следующую строку в макет элемента listview:
android:background="@drawable/bg_key"затем определите
bg_key.xmlнаdrawableпапка такой:<?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>наконец, включите это в свой
ListViewonClickListener:listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) { view.setSelected(true); ... // Anything } });таким образом, только один элемент будет выбран цветом в любое время. Вы можете определить свои значения цвета в
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>
нашел правильный путь. Все очень просто. В ресурсе опишите следующее:
android:choiceMode="singleChoice" android:listSelector="#666666"(или вы можете указать ссылку, а не Значение цвета)
Programmatical:
listView.setSelector(Drawable selector) listView.setSelector(int resourceId) listView.setChoiceMode(int mode)режим может быть одним из следующих: AbsListView.CHOICE_MODE_SINGLE, AbsListView.CHOICE_MODE_MULTIPLE, AbsListView.CHOICE_MODE_NONE (по умолчанию)
(AbsListView является абстрактным предком для класса ListView)
П. С. манипуляции с onItemClick и изменение фона представления обанкротились, потому что само представление является временным объектом. Следовательно, вы не должны отслеживать вид.
Если наш список достаточно длинный, представления, связанные с прокрученными элементами, будут удалены из иерархии и будут воссозданы, когда эти элементы будут показаны снова (с кэшированными параметрами отображения, такими как фон). Таким образом, вид, который мы отслеживали, теперь не является фактическим представлением элемента, и изменение его фона ничего не делает с фактическим представлением элемента. В результате мы есть несколько выбранных элементов.
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); });возможно, вы захотите сохранить текущий выбранный элемент в глобальной переменной с помощью индекса i.
упрощенный способ заключается в том,что если вы используете listview в xml, используйте эти атрибуты в своем listview,
android:choiceMode="singleChoice" android:listSelector="#your color code"если не использовать xml, то программно
listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); listview.setSelector(android.R.color.holo_blue_light);
вам нужен селектор вот так:
<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>и затем установить
android:choiceMode="singleChoice"в ваш ListView.
из примера Авинаша Кумара Панкаджа
View v;тогда в oncreate метод
v = new View(getActivity());а потом onlistitemclick метод я написал
public void onListItemClick(ListView listView, View view, int position, long id) { v.setBackgroundResource(0); view.setBackgroundResource(R.color.green); v = view; }это сработало для меня. Спасибо.
Я заменил
v = new View(getActivity());до
v = new View(this);и код работал хорошо.
также необходимы xml-файлы 'colors' и 'bg_key' из предыдущих примеров, а также атрибут ListView android: background= "@drawable/bg_key"
Мауро
*пожалуйста, убедитесь, что нет пульсации в корневом макете контейнера представления списка
добавьте эту строку в свой список
android:listSelector="@drawable/background_listview"вот " background_listview.xml " file
<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>цвета, которые используются в background_listview.xml-файл:
<color name="primary_color">#cc7e00</color> <color name="white_background">#ffffffff</color>после
(щелкните элемент содержит оранжевый цвет, пока вы не нажмете другой элемент)
один из способов сделать это, чтобы отслеживать текущую выбранную позицию в вашей деятельности:
@Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { currentPosition = position lv_cli.notifyDataSetChanged(); }теперь убедитесь, что вы назначили идентификатор родительскому макету (linearLayout, boxLayout, relativeLayout, .. Что вы предпочитаете) элемента списка.
тогда в вашем ListView вы можете сделать что-то вроде этого:
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); }в принципе, вы просто устанавливаете цвет hilight для макета в качестве фона, когда он равен вашей текущей выбранной позиции. Обратите внимание, как я установите рисуемый фоновый ресурс, если элемент не выбран. Это может быть в вашем случае по-другому (так как вы не опубликовали код). В моем случае этот drawable-это селектор, который гарантирует, что элемент hi-lighted при нажатии.
Примечание: этот простой код не использует вид-держатель, но я действительно рекомендую использовать один.
вместо того, чтобы использовать код:
Это самый простой метод, который можно обрабатывать, даже если список длинный:
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; }и затем в вашем 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(); .....
Comments