在Android上的ListView中突出显示所选项目

时间:2014-03-03 18:24:43

标签: android xml listview android-listview listadapter

我一直在制作一个与Android中的ListViews一起使用的应用程序,但是我不能这样做以使所选(chacked)项具有不同的背景。我正在使用CHOICE_MODE_SINGLE。这是我的代码到目前为止的样子:


我使用的ListView:
(在 layout.xml 内)

<ListView
    android:id="@+id/listView"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:choiceMode="singleChoice"
    android:listSelector="@drawable/selector_test" >
</ListView>

我在适配器中使用的TextView布局:
(的 listItem.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listItem"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="23sp"
    android:textStyle="bold" />

这是我添加适配器的地方:

mListAdapter = new ArrayAdapter<String>(this, R.layout.listItem, mList);
mListView = (ListView) findViewById(R.id.listView);
mListView.setAdapter(mAuthorAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        String selected = mList.get(position);
        // ...
        mListView.setItemChecked(position, true);
    }
});

我确信在点击时会检查正确的项目,因为当我调用getCheckedItemPosition()时,它会返回正确的值。


现在,我尝试了两件事来突出显示已检查的项目:


选择器drawable:
(的 selector_test.xml

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

    <item android:state_checked="true"><shape>
            <solid android:color="@color/red" />
        </shape></item>
    <item android:state_selected="true"><shape>
            <solid android:color="@color/blue" />
        </shape></item>
    <item android:state_pressed="true"><shape>
            <solid android:color="@color/green" />
        </shape></item>

</selector>

我将它添加到.xml中:

android:listSelector="@drawable/selector_test"

背景描述:
(的 background_test.xml

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

    <item android:drawable="@color/red" android:state_checked="true"/>
    <item android:drawable="@color/blue" android:state_selected="true"/>
    <item android:drawable="@color/green"/>

</selector>

我将它添加到.xml中:

android:background="@drawable/background_test"

我已经尝试将选择器和背景添加到listView.xml和listItem.xml中,但唯一改变的是默认背景颜色,以及按下(或保持)项目时选择器的颜色。
android:state_checked =“true”和android:state_selected =“true”似乎什么都不做
我可以通过覆盖ArrayAdapter中的getView()方法并在其中调用setBackgroundColor()来更改背景(如果选择了视图),它确实更改了背景,但也完全摆脱了选择器。另外,我真的不想仅仅更改一行代码来覆盖类,特别是如果可以以不同的方式实现同​​样的事情。

所以我要问的是,有没有办法通过添加选择器或可绘制的背景来突出显示ListView中的已检查项目,我只是做错了,或者我必须让它以其他方式工作。 />
提前致谢! :)

7 个答案:

答案 0 :(得分:8)

在活动的onStart中添加此行

lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

其中lv是listView的实例

然后覆盖此方法并向其添加以下行。

 @Override
public void onListItemClick(ListView l, View v, int position, long id) {


    // Set the item as checked to be highlighted 
    lv.setItemChecked(position, true);
            v.setBackgroundColor(Color.BLUE);

        conversationAdapter.notifyDataSetChanged();

}

然后在自定义适配器的getView方法中将之前所选项目背景的颜色更改为正常

答案 1 :(得分:5)

试试这个:

listViewDay.setItemChecked(position, true);
listViewDay.setSelection(position);

<强> listitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="40dp"
    android:background="@drawable/list_day_selector" >

    <TextView
        android:id="@+id/txtItemDay"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_vertical|center_horizontal"
        android:text="22"
        android:textColor="@android:color/white"
        android:textSize="22sp" />

</LinearLayout>

<强> list_selector.xml

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

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

</selector>

答案 2 :(得分:3)

以编程方式使用setSelector。例如:

lv.setSelector(R.color.abc_background_cache_hint_selector_material_dark);

答案 3 :(得分:0)

经过几个小时遇到一个又一个小故障(包括选择器留下脏条纹)后,我决定自己做:

class MyListAdapter extends ArrayAdapter<MyData> {
    // !!! access to the current selection
    int mSelected = 0;
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v =  super.getView(position, convertView, parent);
        // !!! this is where the selected item is highlighted
        v.findViewById(R.id.selectionSign).setVisibility(position == mSelected ? View.VISIBLE : View.INVISIBLE);
        return v;
    }
    public CommandListAdapter(Context context, List<MyData> objects) {
        super(context, R.layout.mylistitem, R.id.mytext, objects);
    }
}

使用OnItemClickListener:

        mMyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                setSelectionPosNoUpd(position);
                update();
            }
        });

和函数定义为:

    void setSelectionPosNoUpd(int n) {
        mCommandListAdapter.mSelected = n;
        //update();
    }
    void update() {
        mListViewOfCommands.smoothScrollToPosition(getSelectionPos());
        mCommandListAdapter.notifyDataSetChanged();
    }

和列表项XML( res / layout / mylistitem.xml )是:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/mytext" 
        />
    </LinearLayout>
    <View
        android:id="@+id/selectionSign"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#10ff5000"
        android:visibility="invisible"
        />
</FrameLayout>

缺点是更改选择后我必须更新():没有简单的方法可以取消突出显示之前突出显示的视图。

答案 4 :(得分:0)

在选择器中设置项目状态,如下所示:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true"
        android:color="@color/XXX/>
</selector>

我不知道为什么 state_checked 无效。起初我认为它必须是Checkableview然后我尝试了CheckedTextView。仍然没有工作。
无论如何, state_activated 将解决问题。

答案 5 :(得分:-1)

我认为你不能在匿名类中使用 mListView 。您必须使用 AdapterView arg0

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View view,
                int position, long id) {
            AnyObject obj=(AnyObject)arg0.getItemAtPosition(position);

                            ........
                            .........
                            .........

        }
    });

答案 6 :(得分:-1)

这篇文章对我有用:http://www.mynewsfeed.x10.mx/articles/index.php?id=14

ListView(在layout.xml内):

<ListView
    android:id="@+id/list"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:background="@drawable/list_custom"
    android:choiceMode="singleChoice"/>

Selector drawable(list_custom.xml):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/orange"/>
    <item android:state_activated="true" android:drawable="@color/blue" />
    <item android:drawable="@color/green" />
</selector>

值文件夹中的Color.xml:

<resources>
    <item name="blue" type="color">#FF33B5E5</item>
    <item name="green" type="color">#FF99CC00</item>
    <item name="orange" type="color">#FFFFBB33</item>
</resources>
相关问题