解决方法
显然,“消失的选择”是设计的;这是一个叫“
touch mode”的东西.我阅读了该文件,但我仍然不知道为什么他们认为这是一个好主意.我的猜测是,由于Android最初是为小屏幕设备而设计的,他们希望您可以在列表中填写屏幕,然后当用户单击某个项目时,移动到不同屏幕上的新列表.因此,用户不会意识到Android失去了所选项目的跟踪.
但是,如果您希望用户选择一个项目,然后在同一个屏幕上显示有关该项目的信息,则这种行为是非常烦人的.如果选择消失,用户应该如何知道他们点击什么(假设用户有金鱼的注意力)?
一个可能的解决方案是将所有列表项更改为单选按钮.我真的不喜欢这个解决方案,因为它浪费了屏幕空间.我宁愿只使用背景颜色来显示选择的项目.到目前为止,我已经看到了一个解决方案,但是并不完全或一般.所以这里是我的解决方案:
1.在您的XML布局文件中
转到您的ListView元素和以下属性:android:choiceMode =“singleChoice”.我不完全确定这是什么(本身不允许用户选择任何东西),但没有这个属性,下面的代码不起作用.
2.定义以下类
它用于跟踪所选项目,还允许您模拟Java中的传递参考:
public class IntHolder { public int value; public IntHolder() {} public IntHolder(int v) { value = v; } }
3.将以下代码放在某处
我会假设你把它放在你的活动中,但它可以在任何类中真的:
static void setListItems(Context context,AdapterView listView,List listItems,final IntHolder selectedPosition) { setListItems(context,listView,listItems,selectedPosition,android.R.layout.simple_list_item_1,android.R.layout.simple_spinner_dropdown_item); } static void setListItems(Context context,final IntHolder selectedPosition,int list_item_id,int dropdown_id) { listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> list,View lv,int position,long id) { selectedPosition.value = position; } }); ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(context,list_item_id,listItems) { @Override public View getView(int position,View convertView,ViewGroup parent) { View itemView = super.getView(position,convertView,parent); if (selectedPosition.value == position) itemView.setBackgroundColor(0xA0FF8000); // orange else itemView.setBackgroundColor(Color.TRANSPARENT); return itemView; } }; adapter.setDropDownViewResource(dropdown_id); listView.setAdapter(adapter); }
此代码执行以下两件事情:它将您的列表项(例如List< String>)附加到您的ListView,并用一些改变所选项目背景的代码覆盖ArrayAdapter.getView().
4.使用该代码设置列表
例如:
ListView _list; IntHolder _selectedItem = new IntHolder(-1); // nothing selected at first @Override protected void onCreate(Bundle savedInstanceState) { ... _list = (ListView)findViewById(R.id.list); List<String> items = Arrays.asList("Item 1","Item 2","Item 3"); setListItems(this,_list,items,_selectedItem); }
就这样!上面假设你想要单选.通过对getView()的一些小的修改,您可以支持多选,我猜,但您应该可以使用复选框.
警告:此解决方案需要进一步开发.如果用户使用箭头键或按钮来选择项目,则不会从IntHolder的角度选择该项目.如果用户按下未标记的按钮(该按钮的名称是什么?“输入”?),则该项目将被“正式”选择,但是您还有另一个问题,因为如果用户再次使用箭头键,那么它将会看起来喜欢两个项目被选中.如果您想知道如何使IntHolder中的“内部选择”与“键盘选择”同步,或者称之为任何内容,请发表评论.它叫什么呢?