Android ==> ListView保持选择?

前端之家收集整理的这篇文章主要介绍了Android ==> ListView保持选择?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个列表视图充满了项目,用户选择一个项目亮起,然后它恢复正常.有没有办法做到这一点,当用户在ListView中选择一个项目时,它保持选中状态,并突出显示

解决方法

显然,“消失的选择”是设计的;这是一个叫“ 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中的“内部选择”与“键盘选择”同步,或者称之为任何内容,请发表评论.它叫什么呢?

猜你在找的Android相关文章