我在自定义的OnItemSelectedListener中设置了一个ExpandableListView
setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.debug(TAG, "item selected");
// do stuff
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
Log.debug(TAG, "nothing selected");
// do stuff
}
});无论是通过触摸项还是调用setSelected(int)或setSelectedGroup(int),都不会调用此侦听器。
还有其他关于OnItemSelectedListener不与ListView合作的问题,可以追溯到2010年。我找不到一个能解释怎么让它起作用的。常见的答案是使用单击侦听器代替。如果可能的话,我想避免这种情况,因为我需要知道什么时候没有选择(即列表是空的),并且我想利用OnItemSelectedListener#onItemSelected(...)的这个特性
只有在新选定的位置与先前选定的位置不同或没有选定项时,才会调用此回调。
我可以通过其他方法来实现这两个目标,但是如果OnItemSelectedListener有效的话会更好。
编辑:似乎ExpandableListView在项目选择方面完全崩溃了。在单击侦听器中调用时,此片段将选定项记录为-1:
setSelection(0);
setSelectedGroup(0);
Log.debug(TAG, "selected item: " + getSelectedItemPosition());发布于 2015-10-15 09:15:40
使用点击监听器不仅仅是一种懒散的解决办法。感谢一些糟糕的设计决策,这是唯一的选择。2008年博文解释了OnItemSelectedListener不工作的原因:
在触摸模式下,没有焦点,也没有选择。一旦用户进入触摸模式,网格中sic列表中的任何选定项都会被取消选择。
它继续说:
触摸模式、选择和焦点之间的关系意味着应用程序中不能依赖选择和/或焦点。新的安卓开发人员最常见的问题是依赖
ListView.getSelectedItemPosition()。在触摸模式下,此方法将返回INVALID_POSITION。
这样做的理由如下:
设想一个简单的应用程序。。。它显示文本项的列表。用户可以使用轨迹球自由浏览列表,也可以用手指滚动和抛出列表。这个场景中的问题是选择。如果我在列表的顶部选择了一个项目,然后将列表抛向底部,那么所选内容应该发生什么变化?它应该保留在项目上并从屏幕上滚动吗?在这种情况下,如果我决定用轨迹球移动选择,会发生什么?或者更糟的是,如果我按下轨迹球对当前选定的项目采取行动,这将不再显示在屏幕上。经过仔细考虑,我们决定完全取消选择。
在回答这些问题时,Android忽略了其他UI工具包建立的约定和数十年的用户体验。当列表被滚动时,所选内容是否应该保留在项目上?是,当然应该!如果您移动了所选内容,会发生什么情况?视图将滚动到新的选择中。,如果您按下轨迹球?在当前选择上法案!
他们的“仔细考虑”显然也没有包括把这些重要信息放在哪里。这属于ListView的文档,而不是博客文章。
发布于 2015-10-15 07:53:45
请使用适合您的下列方法之一
exlvReportData.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
return false;
}
});
// Listview Group expanded listener
exlvReportData.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
//Toast.makeText(getApplicationContext(),
//listDataHeader.get(groupPosition) + " Expanded",
//Toast.LENGTH_SHORT).show();
}
});
// Listview Group collasped listener
exlvReportData.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
//Toast.makeText(getApplicationContext(),
//listDataHeader.get(groupPosition) + " Collapsed",
// Toast.LENGTH_SHORT).show();
}
});
// Listview on child click listener
exlvReportData.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
// TODO Auto-generated method stub
// Toast.makeText(
// getApplicationContext(),
// listDataHeader.get(groupPosition)
// + " : "
// + listDataChild.get(
// listDataHeader.get(groupPosition)).get(
// childPosition), Toast.LENGTH_SHORT)
// .show();
return false;
}
});如果您有任何问题,请随时发表意见。
https://stackoverflow.com/questions/33142620
复制相似问题