Элемент списка избранных элементов Android ListView выделен
У меня есть XML
с двумя ListView
, один со списком клиентов, заполненный запросом select (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();
}
});
Ответы
Ответ 1
Чтобы сохранить цвет элемента списка при его нажатии, включите следующую строку в макет элемента списка:
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>
Наконец, включите это в свой ListView
onClickListener
:
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>
Ответ 2
Найден правильный путь. Это очень просто.
В ресурсе описывается следующее:
android:choiceMode="singleChoice"
android:listSelector="#666666"
(или вы можете указать ссылку ресурса вместо значения цвета)
Программный способ:
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)
P.S. манипуляции с onItemClick и изменение фона обзора являются обанкротившимися, поскольку само представление является временным объектом. Следовательно, вы не должны отслеживать представление.
Если наш список достаточно длинный, представления, связанные с прокручиваемыми элементами, будут удалены из иерархии и будут воссозданы, когда эти элементы будут показаны снова (с кешированными параметрами отображения, такими как фон). Таким образом, представление, которое мы отслеживали, теперь не является фактическим видом элемента, и изменение его фона ничего не делает для фактического представления элемента. В результате мы выбрали несколько элементов.
Ответ 3
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.
Ответ 4
Упрощенный способ: если вы используете listview в xml, используйте эти атрибуты в своем списке,
android:choiceMode="singleChoice"
android:listSelector="#your color code"
если не использовать xml, программно
listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
listview.setSelector(android.R.color.holo_blue_light);
Ответ 5
Вам нужен селектор:
<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.
Ответ 6
Из примера Авинаша Кумара Панкаджа
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 файлов и "bg_key", а также атрибут ListView android: background = "@drawable/bg_key"
Мауро
Ответ 7
* убедитесь, что в вашем корневом расположении контейнера списка отсутствует пульсация
добавить эту строку в список просмотра
android:listSelector="@drawable/background_listview"
вот файл "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>
цвета, используемые в файле background_listview.xml:
<color name="primary_color">#cc7e00</color>
<color name="white_background">#ffffffff</color>
после этих
(нажатый элемент содержит оранжевый цвет, пока вы не нажмете другой элемент)
Ответ 8
Один из способов сделать это - отслеживать текущую выбранную позицию в вашей деятельности:
@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 является селектором, который гарантирует, что элемент будет подсвечен при нажатии.
ПРИМЕЧАНИЕ. Этот простой код не использует вид-держатель, но я действительно рекомендуем использовать его.
Ответ 9
Используйте вместо этого id:
Это самый простой метод, который может обрабатываться, даже если список длинный:
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();
.....