选中 ListView 项目的颜色选择器需要帮助

9

我有一个ListView,其中包含自定义布局的项,并需要使用选择器为选中的项指定单独的背景颜色。 以下是奇数项的选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@android:color/black" />
    <item android:state_checked="true" android:drawable="@android:color/black" />
    <item android:state_selected="true" android:drawable="@color/red" />
    <item android:drawable="@android:color/white" />
</selector>

这里是偶数项的选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@android:color/black" />
    <item android:state_checked="true" android:drawable="@android:color/black" />
    <item android:state_selected="true" android:drawable="@color/red" />
    <item android:drawable="@color/gray" />
</selector>

ListView的项模板如下所示:

<?xml version="1.0" encoding="utf-8"?>
<com.androidhub.core.CheckableLinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="40dip">
    <TextView 
        android:text="TextView" 
        android:id="@+id/textView1" 
        android:layout_height="fill_parent" 
        android:layout_width="wrap_content" 
        android:gravity="center_vertical" 
        android:textColor="@color/list_item"></TextView>
</com.androidhub.core.CheckableLinearLayout>

列表项的根元素是CheckableLinearLayout:http://paste.org/pastebin/view/28711

ListView有单选模式(我也尝试了多选模式,但对我来说也不起作用)

public class MainActivity extends ListActivity {

    List<String> items = new ArrayList<String>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        items.add("test 1");
        items.add("test 2");
        items.add("test 3");
        items.add("test 4");
        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        getListView().setAdapter(new TestAdapter(this, items));
        getListView().setBackgroundColor(getResources().
            getColor(android.R.color.white));
    }
}
在这个ListView的适配器中,我调用了CheckableLinearLayout的setChecked()方法,但它并没有改变颜色:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View v = convertView;
    if(v == null) {
        v = inflater.inflate(R.layout.list_item, null);
    }

    if(position % 2 != 0) {
        v.setBackgroundResource(R.drawable.list_item_even);
    }
    else {
        v.setBackgroundResource(R.drawable.list_item_odd);
    }

    if(parent instanceof ListView) {
        ListView lv = (ListView)parent;
        if(v instanceof CheckableLinearLayout) {
            CheckableLinearLayout cll = (CheckableLinearLayout)v;
            cll.setChecked(lv.isItemChecked(position));
        }
    }

    return v;
}

我做错了什么?我可以看到选择器中的state_pressed项目可以正常工作,但是state_checked无法正常工作。 从XML设置state_checked背景的正确方法是什么?而不是从代码中设置。


我猜你的问题出在你的适配器上。对于这种情况,你应该扩展BaseExpandableListAdapter。在这个类中,你可以重写getGroupViewgetChildView方法,并设置适当的颜色/大小/形状等。请查看这个问题,我在那里也发布了一个示例适配器实现。 - rekaszeru
谢谢您的评论,但我想要实现的主要目标是在XML中设置背景颜色,而不是在代码中。我已经知道如何在代码中实现这一点,但当我更改应用程序的UI样式时,我也需要更改代码。这非常不方便。 - T-Rex
请参考此问题:https://dev59.com/UG865IYBdhLWcg3wlvmq - basicsharp
3个回答

2
我认为您正在寻找这个属性:

android:duplicateParentState="true"
尝试将其添加到单元格布局中的CheckableLinearLayout标记中。 按键/释放是唯一传播到ViewGroup的子视图的事件,因此每个视图将管理自己的状态,除非您明确告诉它使用父级的状态。 此更改后,我认为您可以删除整个代码块,强制CheckableLinearLayout被选中。
if(parent instanceof ListView)...

0
尝试像这样实现 getListView().setOnItemClickListener:
OnItemClickListener listener = new OnItemClickListener() {

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

        CheckableLinearLayout r;
        for(int i = 0; i< lv.getChildCount(); i++) {
            r= (CheckableLinearLayout)lv.getChildAt(i);
            if(i==position)
                r.setChecked(true);
            else
                r.setChecked(false);
        }

    }
};

0
你尝试过创建一个类似于这样的XML来保存你的ListView吗?在@+id/android:list标签周围有一些巫术。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" 
        android:background="@drawable/megaphone_320x480">
        <ListView 
                android:id="@+id/android:list"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" 
                android:background="@drawable/megaphone_320x480"
                android:cacheColorHint="@drawable/transparent"
                />
        <TextView 
                android:id="@id/android:empty" 
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" 
                android:textColor="@drawable/red"
                android:gravity="center_vertical|center_horizontal"
                android:textStyle="bold"
                android:text="@string/error_no_groups" 
                />
</LinearLayout>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,