ExpandableListView有一个setOnChildClickListener方法,但缺少setOnChildLongClickListener方法。
当我在getChildView()
的子视图中添加setOnLongClickListener()
时,整个子列表变得完全无法点击(尽管parentView.setOnChildClickListener()
已经存在并且以前可以正常工作)。
如何在子视图上启用长点击?
发布于 2010-03-01 16:33:14
我在史蒂夫·奥利弗的博客上找到了答案:http://steveoliverc.wordpress.com/2009/10/16/context-menus-for-expandable-lists/
你应该使用onCreateContextMenu()
而不是寻找setOnChildLongClickListener()
。以下是Steve的信息:
可展开列表支持上下文菜单,其方式与标准列表几乎相同:为上下文菜单添加侦听器(当用户长按列表项时)。但是,与标准列表视图不同的是,您可能希望知道用户是否选择了组(可展开项)或子(子项)列表项。
此外,如果用户试图调出组项目的上下文菜单,您可能不想执行任何操作。在某些情况下,您可能希望对某个组下的所有儿童执行某些操作,但在我的Librarium应用程序中,我希望忽略组项目,只为儿童显示上下文菜单。
首先,您需要知道上下文菜单将在何时创建,以便您可以确定用户按下的是组还是子组。如果按下某个组,则取消上下文菜单。这也让我们有机会获得子项的文本,这样我们就可以将其放入上下文菜单的标题中。
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”);
}
}
其次,创建上下文菜单:
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);
}
}
就这样。现在,用户可以长按可展开列表中的项目,如果是子项目,则可以获得上下文菜单。
发布于 2011-11-30 09:37:53
我设法让长点击在ExpandableListView
子项上工作,使用以下方法:
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
参数,这在文档中肯定不是很清楚。
注意:要使此解决方案起作用,您需要覆盖适配器中的getGroupId
和getChildId()
方法
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
发布于 2013-05-08 16:46:39
我知道这个答案可能没有必要,但我有类似的情况,这些答案都不能解决我的问题。所以我把我的贴出来,以防有人需要它。希望你们不会介意。
@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。
https://stackoverflow.com/questions/2353074
复制相似问题