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

T-R*_*Rex 9 java mobile android

我有一个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>
Run Code Online (Sandbox Code Playgroud)

这里是偶数项的选择器:

<?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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

列表项的根元素是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));
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个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;
}
Run Code Online (Sandbox Code Playgroud)

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

Fer*_*ego 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);
        }

    }
};
Run Code Online (Sandbox Code Playgroud)