您不能将以下状态drawable用作listview项目的背景。
<item android:drawable="@drawable/ic_launcher" android:state_activated="true"/>
在Pre Honeycomb Devices上,因为那里不支持此选择器,并且android版本不会跟踪激活的项目。
如何模仿此行为?特别是当使用fragements(在一个片段的左侧列表,并根据所选择的右侧的详细视图)时,这个指标非常重要。
我知道这个问题是在here之前提出的,但是那里接受的答案链接到一篇博客文章,该文章在“步骤4”中说明没有可能使用激活的指标而只是禁用用于防止错误。这导致没有显示我正在搜索的指标。
答案 0 :(得分:28)
我使用一个小技巧解决了这个问题:错过了自Android版本1以来存在的state_checked
属性,可以模拟state_activated
行为。无需修改List适配器或自行保存状态。
我写了一个详细的例子,其中包含了重新制作并在github repository上发布它所需的所有代码。
答案 1 :(得分:3)
就像Chris Jenkins建议的那样,我只需在我的getView
覆盖中添加一些代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// ...
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
convertView.setBackgroundColor(Color.WHITE);
if (listView.isItemChecked(position)) {
convertView.setBackgroundColor(Color.LTGRAY);
}
}
}
在我的情况下自动处理被检查的项目(使用CHOICE_MODE_MULTIPLE和v7 ActionMode.Callback并使用setOnItemLongClickListener调用回调)
答案 2 :(得分:0)
只需将适配器中所选列表项的背景更改为“已激活”的drawable。
所以在我的适配器中,get view方法可能看起来像这样:
getView(int pos, View convertView, ViewGroup parent){
//... etc get view etc
if(mSelectedItemPos == pos){
v.setBackgroundDrawable(ctx.getResources().getDrawable(R.drawable.list_item_selected_state);
//or v.setBackgroundResource(R.drawable.list_item.....);
} else {
v.setBackgroundDrawable(ctx.getResources().getDrawable(R.drawable.list_item_selector);
}
}
如果我想在视图上支持选定/激活状态,那就是我所做的一切。更多的工作,但可以像你想要的那样灵活。
答案 3 :(得分:0)
我之前以下列方式手动完成:
创建一个数组来保存列表的选定状态,在适配器构造函数中初始化它,然后在getView方法中引用它(如果当前所选项目滚动出视图)和onItemClick方法(更改当前选择并关闭旧的。)
public static boolean selectedStatus[]; // array to hold selected state
public static View oldView; // view to hold so we can set background back to normal after
构造函数 初始化数组
public class MyCursorAdapter extends SimpleCursorAdapter {
private LayoutInflater mInflater;
private int layout;
public MyCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to, int flags) {
super(context, layout, c, from, to, flags);
mInflater = LayoutInflater.from(context);
this.layout = layout;
selectedStatus = new boolean[c.getCount()];
for (int i = 0; i < c.getCount(); i++) {
selectedStatus[i] = false; // Start with all items unselected
}
}
}
当孩子滚出视野时需要getView
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = View.inflate(context, layout, null);
if(selectedStatus[position] == true){
v.setBackgroundResource(R.color.blue);
} else {
v.setBackgroundResource(R.color.black);
}
return v;
}
onItemClick 更改数组和屏幕上的所选项目
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
mRowId = id;
EventDisplayFragment eventdisplay = new EventDisplayFragment();
getFragmentManager().beginTransaction()
.replace(R.id.rightpane, eventdisplay).commit();
if(MyCursorAdapter.oldView != null){
MyCursorAdapter.oldView.setBackgroundResource(R.color.black); // change the background of the old selected item back to default black }
MyCursorAdapter.oldView = v; // set oldView to current view so we have a reference to change back on next selection
for (int i = 0; i < selectedStatus.length; i++) {
if(i == position){ // set the current view to true and all others to false
selectedStatus[i] = true;
} else {
selectedStatus[i] = false;
}
}
}
v.setBackgroundResource(R.color.blue);
return true;
}
});