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