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

时间:2011-02-10 21:06:46

标签: java android mobile

我有一个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 背景的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

我认为您正在寻找此属性:

android:duplicateParentState="true"

尝试将其添加到单元格布局中的CheckableLinearLayout标记。

按键/释放是唯一传播到ViewGroup子视图的事件,因此除非您明确告诉它使用它的父项,否则每个视图都将管理它自己的状态。

此外,在此更改之后,我认为您可以删除强制检查CheckableLinearLayout的整个代码块:

if(parent instanceof ListView)...

答案 1 :(得分: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);
        }

    }
};

答案 2 :(得分: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>