Как выделить выбранный элемент в ListView?

Я знаю, что android ничего не выделяет в TouchMode. Но я делаю что-то похожее на приложение gmail, в котором вы выбираете материал с левой стороны и показываете детали с правой стороны действия(интересно, как это сделал Google).

история такова я должен подчеркнуть, что выбран в левой части списка. Я нашел несколько похожих вопросов, и решения в основном:

1.переопределить метод getView адаптера и setBackground для выбранной должности

2.setBackground представления onItemClick и очистить его для выбора пыльника

но ни один из них не работал для меня из-за странного поведения: когда я нажимаю на один элемент и выделяю его, Пятый элемент после того, как он выделен, и так далее, когда я прокручиваю список.

какие предложения? THX!

6 ответов


использовать listView.setChoiceMode (int choiceMode);

параметры

choiceMode один из CHOICE_MODE_NONE, CHOICE_MODE_SINGLE или CHOICE_MODE_MULTIPLE из класса android.штучка.AbsListView

http://developer.android.com/reference/android/widget/AbsListView.html#setChoiceMode(int)

Вам также нужно добавить MultiChoiceModeListener, вы можете иметь CHOICE_MODE_SINGLE

(android.штучка.AbsListView.MultiChoiceModeListener)

см. Образец ниже

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List16.html


это для пользовательских listactivity или ListFragment

выделите выбранный элемент в ListView

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long arg3)
{

    for(int a = 0; a < parent.getChildCount(); a++)
    {
        parent.getChildAt(a).setBackgroundColor(Color.TRANSPARENT);
    }

    view.setBackgroundColor(Color.GREEN);
}

/ / / / @drawable / list_selector

 <selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/list_item_bg_normal"
 android:state_pressed="false" android:state_selected="false" android:state_activated="false"/>

<item android:drawable="@drawable/list_item_touch"
 android:state_pressed="true"/>

 <item android:drawable="@drawable/list_item_touch"
 android:state_pressed="false" android:state_selected="true"/>

 <item android:drawable="@drawable/list_item_bg_pressed"
 android:state_activated="true"/>

 </selector>

////////////////////и на ListView

 <ListView
    android:id="@+id/list_slidermenu"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/list_selector"
    android:background="@color/list_background"
    android:divider="#060606"/>

///////////////////////элемент listview

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@drawable/list_selector">

  <ImageView
  android:id="@+id/icon"
  android:layout_width="35dp"
  android:layout_height="wrap_content"
  android:layout_alignParentLeft="true"
  android:layout_marginLeft="12dp"
  android:layout_marginRight="12dp"
  android:contentDescription="@string/desc_list_item_icon"
  android:src="@drawable/ic_home"
  android:layout_centerVertical="true" />

  </RelativeLayout>

причина, по которой вы выделяете несколько элементов, вероятно, заключается в том, что вы либо: повторно используете весь вид, либо устанавливаете фон обоих этих представлений в один и тот же экземпляр Drawable. Если у вас есть один и тот же drawable на экране дважды, все события, которые происходят с первым, будут происходить со всеми остальными, потому что эта логика реализована в экземпляре самого Drawable.

чтобы решить эту проблему, либо: не повторно использовать представления для нескольких строк, или не повторно использовать Drawables для несколько строк (создайте новую каждый раз)

Я знаю, что это звучит ресурсоемко, и это так, но если у вас нет лучшего решения, это самое простое решение.


поскольку элементы в listviews имитируют те, что вверху, они также имитируют их фон. Вы должны установить каждый из фона ваших элементов в функции getView (). В каждом элементе getView() вы должны установить фон как для выбранных, так и для невыбранных.


используйте это как селектор списка:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/list_bg" />
</selector>

и list_bg:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/list_bg_color" />
</shape>

выберите предпочтительный цвет подсветки