首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓:长时间点击ExpandableListView的子视图?

安卓:长时间点击ExpandableListView的子视图?
EN

Stack Overflow用户
提问于 2010-03-01 07:11:27
回答 5查看 34.4K关注 0票数 47

ExpandableListView有一个setOnChildClickListener方法,但缺少setOnChildLongClickListener方法。

当我在getChildView()的子视图中添加setOnLongClickListener()时,整个子列表变得完全无法点击(尽管parentView.setOnChildClickListener()已经存在并且以前可以正常工作)。

如何在子视图上启用长点击?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-01 16:33:14

我在史蒂夫·奥利弗的博客上找到了答案:http://steveoliverc.wordpress.com/2009/10/16/context-menus-for-expandable-lists/

你应该使用onCreateContextMenu()而不是寻找setOnChildLongClickListener()。以下是Steve的信息:

可展开列表支持上下文菜单,其方式与标准列表几乎相同:为上下文菜单添加侦听器(当用户长按列表项时)。但是,与标准列表视图不同的是,您可能希望知道用户是否选择了组(可展开项)或子(子项)列表项。

此外,如果用户试图调出组项目的上下文菜单,您可能不想执行任何操作。在某些情况下,您可能希望对某个组下的所有儿童执行某些操作,但在我的Librarium应用程序中,我希望忽略组项目,只为儿童显示上下文菜单。

首先,您需要知道上下文菜单将在何时创建,以便您可以确定用户按下的是组还是子组。如果按下某个组,则取消上下文菜单。这也让我们有机会获得子项的文本,这样我们就可以将其放入上下文菜单的标题中。

代码语言:javascript
复制
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenuInfo menuInfo)             
{
  super.onCreateContextMenu(menu, v, menuInfo);

  ExpandableListView.ExpandableListContextMenuInfo info =
    (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;

  int type =
    ExpandableListView.getPackedPositionType(info.packedPosition);

  int group =
    ExpandableListView.getPackedPositionGroup(info.packedPosition);

  int child =
    ExpandableListView.getPackedPositionChild(info.packedPosition);

  // Only create a context menu for child items
  if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) 
  {
    // Array created earlier when we built the expandable list
    String page =mListStringArray[group][child];

    menu.setHeaderTitle(page);
    menu.add(0, MENU_READ, 0, “Read page”);
    menu.add(0, MENU_EDIT, 0, “Edit page”);
    menu.add(0, MENU_FAVORITE, 0, “Add page to favorites”);
    menu.add(0, MENU_EXPORT, 0, “Export page to file”);
    menu.add(0, MENU_DELETE, 1, “Delete page”);
  }
}

其次,创建上下文菜单:

代码语言:javascript
复制
public boolean onContextItemSelected(MenuItem menuItem) 
{
  ExpandableListContextMenuInfo info = 
    (ExpandableListContextMenuInfo) menuItem.getMenuInfo();

  int groupPos = 0, childPos = 0;

  int type = ExpandableListView.getPackedPositionType(info.packedPosition);
  if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) 
  {
    groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
    childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
  }

  // Pull values from the array we built when we created the list
  String author = mListStringArray[groupPos][0];
  String page = mListStringArray[groupPos][childPos * 3 + 1];
  rowId = Integer.parseInt(mListStringArray[groupPos][childPos * 3 + 3]);

  switch (menuItem.getItemId()) 
  {
    case MENU_READ:
      readNote(rowId);
      return true;

    case MENU_EDIT:
      editNote(rowId);
      return true;

    // etc..

    default:
      return super.onContextItemSelected(menuItem);
  }
}

就这样。现在,用户可以长按可展开列表中的项目,如果是子项目,则可以获得上下文菜单。

票数 40
EN

Stack Overflow用户

发布于 2011-11-30 09:37:53

我设法让长点击在ExpandableListView子项上工作,使用以下方法:

代码语言:javascript
复制
getExpandableListView().setOnItemLongClickListener(new OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
            int groupPosition = ExpandableListView.getPackedPositionGroup(id);
            int childPosition = ExpandableListView.getPackedPositionChild(id);

            // You now have everything that you would as if this was an OnChildClickListener() 
            // Add your logic here.

            // Return true as we are handling the event.
            return true;
        }

        return false;
    }
});

花了很长时间才弄清楚onItemLongClick中的id参数是getPackedPosition*方法所需的packedPosition参数,这在文档中肯定不是很清楚。

注意:要使此解决方案起作用,您需要覆盖适配器中的getGroupIdgetChildId()方法

代码语言:javascript
复制
   @Override
   public long getGroupId(int groupPosition) {
      return groupPosition;
   }

   @Override
   public long getChildId(int groupPosition, int childPosition) {
      return childPosition;
   }
票数 87
EN

Stack Overflow用户

发布于 2013-05-08 16:46:39

我知道这个答案可能没有必要,但我有类似的情况,这些答案都不能解决我的问题。所以我把我的贴出来,以防有人需要它。希望你们不会介意。

代码语言:javascript
复制
@Override
                public boolean onItemLongClick(AdapterView<?> parent, View childView, int flatPos, long id) {
                     if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
                            final ExpandableListAdapter adapter = ((ExpandableListView) parent).getExpandableListAdapter();
                            long packedPos = ((ExpandableListView) parent).getExpandableListPosition(flatPos);
                            int groupPosition = ExpandableListView.getPackedPositionGroup(packedPos);
                            int childPosition = ExpandableListView.getPackedPositionChild(packedPos);

                        // do whatever you want with groupPos and childPos here - I used these to get my object from list adapter.
                    return false;
                }

编辑这个列表视图的解决方案是很久以前的事情了。我强烈建议您现在就迁移到RecyclerView

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2353074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档