15

我有一个愚蠢的小问题。我已经注册了一个ListFragment作为OnItemClickListenerOnItemLongClickListener它自​​己的ListView

调用事件时onItemClick,会启动该项目的详细视图活动的意图,那里没有问题。

onItemLongClick事件发生时,我想完成以下事情:

  • 创建 CAB
  • 保持选中的长按项目

代码:

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    if(this.cabMode != null)
        return false;
    this.cabMode = getActivity().startActionMode(editModeCallback);
    view.setSelected(true);
    return true;
}

CAB 将显示,但是,选择不会保留在项目中。

一些零碎的东西,以防它们相关:我已经阅读了有关通过调用view.requestFocusFromTouch()或使用来解决此问题的信息listView.setItemChecked(),但这对我不起作用。此外,列表项的视图是从自定义布局实例化的,但没有附加任何自定义事件侦听器。

任何帮助表示赞赏。谢谢!

4

2 回答 2

8

这是可能的,但只是勉强......我真的不知道这么简单的事情怎么会变得如此可笑地复杂。

答案的关键可以在这里找到:Android:ListView selection 后保持蓝色背景

这归结为定义一个附加样式,ListView并将选择模式设置为AbsListView.CHOICE_MODE_SINGLE(如链接答案中所述)。

这允许您以编程方式使用 切换选择Listview.setItemChecked()。但是,您需要自己跟踪onItemLongClick回调中所触摸项目的索引,因为ListView.setSelection()不会这样做(至少ListView.getSelectedItem()在我所见的情况下总是会返回 -1)。

代码(为简单起见,我的片段实现了所有三个OnItemClickListenerOnItemLongClickListenerActionMode.Callback):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    this.listViewAdapter = new ListViewAdapter();
    this.root = (ListView)inflater.inflate(R.layout.fragment_bookmarks, container, false);
    this.root.setAdapter(this.listViewAdapter);
    this.root.setOnItemClickListener(this);
    this.root.setOnItemLongClickListener(this);
    this.root.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
    return this.root;
}

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    if(this.cabMode != null)
        return false;
    this.selectedPosition = position;
    this.root.setItemChecked(position, true);

    this.root.setOnItemClickListener(null);
    this.cabMode = getActivity().startActionMode(this);
    return true;
}

最后,如果您想在 CAB 关闭时摆脱选择:

@Override
public void onDestroyActionMode(ActionMode mode) {
    cabMode = null;
    this.root.setItemChecked(this.selectedPosition, false);
    this.selectedPosition = -1;
    this.root.setOnItemClickListener(this);
}

注册和取消注册OnItemClickListener可确保当 CAB 处于活动状态时,您不会意外触发通常与项目关联的操作(如打开详细视图)。

于 2013-02-27T12:35:01.763 回答
1

我的解决方案:(技巧)

final ListView lvMain = (ListView) activity.findViewById(R.id.listTHEMES);
lvMain.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lvMain.setItemsCanFocus(false);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity,
            android.R.layout.simple_list_item_multiple_choice, ArrayTheme);
lvMain.setAdapter(adapter);
lvMain.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                       int pos, long id) {
        // TODO Auto-generated method stub
        if (lvMain.isItemChecked(pos)){lvMain.setItemChecked(pos,false);}else{lvMain.setItemChecked(pos,true);}
        Log.v(LOG_TAG,"long clicked pos: " + pos);
        //lvMain.setSelection();

        return true;
    }
});
lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
        //Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id);
        if (lvMain.isItemChecked(position)){lvMain.setItemChecked(position,false);}else{lvMain.setItemChecked(position,true);}

    }
});
于 2017-03-31T14:20:20.307 回答