Как выделить выбранный элемент в 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)
см. Образец ниже
это для пользовательских 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>
выберите предпочтительный цвет подсветки