ListView保持选中状态?

ary*_*axt 10 android listview highlight

我有一个包含项目的列表视图,在用户选择一个项目点亮后,它会恢复正常.有没有办法让它在用户选择ListView中的项目时保持选中状态并突出显示?

Qwe*_*tie 15

显然,"消失的选择"是设计的; 这就是所谓的" 触摸模式 ".我仔细阅读了该文件,但我仍然不知道为什么他们认为这是一个好主意.我的猜测是,由于Android最初是为小屏幕设备设计的,他们希望你用一个列表填充屏幕,然后当用户点击一个项目时,移动到另一个屏幕上的新列表.因此,用户不会意识到Android丢失了所选项目的跟踪.

但是,例如,如果您希望用户选择项目然后在同一屏幕上显示有关该项目的信息,则此行为非常烦人.如果选择消失,用户应该如何知道他们点击了什么(当然假设用户有金鱼的注意力范围)?

一种可能的解决方案是将所有列表项更改为单选按钮.我真的不喜欢这个解决方案,因为它浪费了屏幕空间.我宁愿只使用背景颜色来显示选择了哪个项目.到目前为止,我已经看到了一种解决方案,但它并不完全或一般.所以这是我的解决方案:

1.在XML布局文件中

转到ListView元素和以下属性:android:choiceMode="singleChoice".我不完全确定它的作用(本身,它不允许用户选择任何东西)但没有这个属性,下面的代码不起作用.

2.定义以下类

它用于跟踪所选项目,还允许您在Java中模拟传递引用:

public class IntHolder {
    public int value;
    public IntHolder() {}
    public IntHolder(int v) { value = v; } 
}
Run Code Online (Sandbox Code Playgroud)

3.将以下代码放在某处

我假设你把它放在你的Activity中,但它可以真正进入任何一个类:

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, AdapterView listView, List listItems, 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);
}
Run Code Online (Sandbox Code Playgroud)

此代码执行两项操作:它将列表项(例如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);
}
Run Code Online (Sandbox Code Playgroud)

就这样!以上假设您想要单一选择.通过对getView()的一些小修改,我猜你也可以支持多选,但你可能应该使用复选框.

警告:此解决方案需要进一步开发.如果用户使用箭头键或按钮选择项目,则不会从IntHolder的角度选择该项目.如果用户按下未标记的按钮(该按钮的名称是什么?"输入"?),那么该项目将被"正式"选中,但之后又出现了另一个问题,因为如果用户再次使用箭头键,它会有点像喜欢选择两个项目.如果您弄清楚如何使IntHolder中的"内部选择"与"键盘选择"或其所谓的"键盘选择"保持同步,请发表评论.什么叫,反正?