解决方法
但是,如果您希望用户选择一个项目,然后在同一个屏幕上显示有关该项目的信息,则这种行为是非常烦人的.如果选择消失,用户应该如何知道他们点击什么(假设用户有金鱼的注意力)?
一个可能的解决方案是将所有列表项更改为单选按钮.我真的不喜欢这个解决方案,因为它浪费了屏幕空间.我宁愿只使用背景颜色来显示选择的项目.到目前为止,我已经看到了一个解决方案,但是并不完全或一般.所以这里是我的解决方案:
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中的“内部选择”与“键盘选择”同步,或者称之为任何内容,请发表评论.它叫什么呢?