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();
}
});
445   9  

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

    Ничего не найдено.