首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExpandableListView不调用OnItemSelectedListener

ExpandableListView不调用OnItemSelectedListener
EN

Stack Overflow用户
提问于 2015-10-15 07:38:44
回答 2查看 469关注 0票数 0

我在自定义的OnItemSelectedListener中设置了一个ExpandableListView

代码语言:javascript
复制
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:

代码语言:javascript
复制
setSelection(0);
setSelectedGroup(0);
Log.debug(TAG, "selected item: " + getSelectedItemPosition());
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-15 09:15:40

使用点击监听器不仅仅是一种懒散的解决办法。感谢一些糟糕的设计决策,这是唯一的选择。2008年博文解释了OnItemSelectedListener不工作的原因:

在触摸模式下,没有焦点,也没有选择。一旦用户进入触摸模式,网格中sic列表中的任何选定项都会被取消选择。

它继续说:

触摸模式、选择和焦点之间的关系意味着应用程序中不能依赖选择和/或焦点。新的安卓开发人员最常见的问题是依赖ListView.getSelectedItemPosition()。在触摸模式下,此方法将返回INVALID_POSITION

这样做的理由如下:

设想一个简单的应用程序。。。它显示文本项的列表。用户可以使用轨迹球自由浏览列表,也可以用手指滚动和抛出列表。这个场景中的问题是选择。如果我在列表的顶部选择了一个项目,然后将列表抛向底部,那么所选内容应该发生什么变化?它应该保留在项目上并从屏幕上滚动吗?在这种情况下,如果我决定用轨迹球移动选择,会发生什么?或者更糟的是,如果我按下轨迹球对当前选定的项目采取行动,这将不再显示在屏幕上。经过仔细考虑,我们决定完全取消选择。

在回答这些问题时,Android忽略了其他UI工具包建立的约定和数十年的用户体验。当列表被滚动时,所选内容是否应该保留在项目上?是,当然应该!如果您移动了所选内容,会发生什么情况?视图将滚动到新的选择中。,如果您按下轨迹球?在当前选择上法案!

他们的“仔细考虑”显然也没有包括把这些重要信息放在哪里。这属于ListView的文档,而不是博客文章。

票数 1
EN

Stack Overflow用户

发布于 2015-10-15 07:53:45

请使用适合您的下列方法之一

代码语言:javascript
复制
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;
        }
    });

如果您有任何问题,请随时发表意见。

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

https://stackoverflow.com/questions/33142620

复制
相关文章

相似问题

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