2011-12-19 1 views
9

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

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

1.override метод GetView адаптера и setBackground для выбранной позиции

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

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

Любые предложения? СПАСИБО!

ответ

21

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

Параметры

choiceMode Один из CHOICE_MODE_NONE, CHOICE_MODE_SINGLE или CHOICE_MODE_MULTIPLE из класса android.widget.AbsListView

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

Кроме того, необходимо добавить MultiChoiceModeListener, вы можете иметь CHOICE_MODE_SINGLE

(android.widget.AbsListView.MultiChoiceModeListener)

См. образец ниже

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

+0

делает что-нибудь? Я попробовал, но селектор не остался, хотя .. – Han

+0

добавлено больше объяснений –

+0

Большое спасибо! Добавив MultiChoiceModeListener и установив фон адаптера в XML-файле, он сработал! Но я удивляюсь, почему Android принимает цвет фона только тогда, когда элемент был выбран .. автоматически – Han

1

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

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

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

+0

спасибо человеку .. Я сейчас пытаюсь увидеть, где код повторно мнение, так как я не написал. BTW, можно ли позволить селектору оставаться на вершине в качестве подсветки вместо изменения фона? Это имеет смысл, если это выполнимо. – Han

0

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

16

это для пользовательских 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); 
} 
2

//// @ вытяжке/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 Item

<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> 
0

использовать это в качестве селектора списка:

<?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> 

выберите нужный цвет подсветки