蜂窝设备上的state_activated

您不能使用以下状态作为列表视图项目的背景。

<item android:drawable="@drawable/ic_launcher" android:state_activated="true"/> 

在预蜂窝设备,因为这个select器不支持那里和Android版本不跟踪激活的项目(S)。

这种行为如何被模拟? 尤其是当使用fragements(在一个片段的左侧列表,并根据select的右侧的细节视图)这个指标是非常重要的。

我知道这个问题在这之前就被问过了,但是那里接受的答案链接到一个博客文章,在“步骤4”中指出,不可能有激活的指示器,而只是禁止使用以防止错误。 这导致没有指示器显示这是我正在寻找的事实。

我用一个小技巧解决了这个问题:通过错过使用Android版本1之后存在的state_checked属性,可以模拟state_activated行为。 没有必要修改List适配器或自己保存状态。

我写了一个详细的例子,包含所有必要的代码重新编译并发布到github仓库 。

很像Chris Jenkins所build议的,我只是给我的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调用callback)

只需将适配器中选定列表项的背景改为“已激活”的绘图。

所以在我的适配器中,查看方法可能看起来有点像这样:

 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); } } 

这就是我所做的,如果我想支持select/激活状态的意见。 多一点工作,但可以像你想要的那样灵活。

我已经按照以下方式手动完成了:

创build一个数组来保存列表的选定状态,在适配器构造函数中初始化它,然后在getView方法中引用它(当前select的项目滚动出视图)和onItemClick方法(更改当前的select并转向closures旧的)。

 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; } });