ExpandableListView不调用OnItemSelectedListener

时间:2015-10-15 07:38:44

标签: android android-listview expandablelistview

我已在自定义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)

还有其他Q&amp; As可追溯至2010年OnItemSelectedListener未与ListView合作。我无法找到一个真正解释如何让它工作的人。常见的答案是使用单击侦听器。我希望尽可能避免这种情况,因为我需要知道什么时候没有选择(即列表是空的),我想利用OnItemSelectedListener#onItemSelected(...)的这个特性:

  

仅当新选择的位置与先前选择的位置不同或者没有选定的项目时,才会调用此回调。

我可以通过其他方式实现这两个方面,但如果OnItemSelectedListener有效,那就更好了。

修改:项目选择似乎完全打破ExpandableListView。在单击侦听器中调用时,此代码段将所选项目记录为-1:

setSelection(0);
setSelectedGroup(0);
Log.debug(TAG, "selected item: " + getSelectedItemPosition());

2 个答案:

答案 0 :(得分:1)

使用点击监听器并不仅仅是一种懒惰的解决方法。由于一些可怕的设计决定,它是唯一的选择。 blog post from 2008解释了OnItemSelectedListener无效的原因:

  

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

它继续:

  

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

其基本原理如下:

  

想象一个简单的应用程序。 。 。它显示了一个文本项列表。用户可以使用轨迹球自由地浏览列表,他们还可以使用他们的手指滚动和推送列表。此方案中的问题是选择。如果我在列表顶部选择一个项目然后将列表向底部推送,那么选择会发生什么?它应该保留在项目上并滚动屏幕吗?在这种情况下,如果我决定用轨迹球移动选择会发生什么?或者更糟糕的是,如果我按下轨迹球来操作当前所选的项目,该项目不再显示在屏幕上。仔细考虑后,我们决定完全删除选择。

&lt; rant&gt;在回答这些问题时,Android开发者忽略了其他UI工具包和几十年用户体验所建立的惯例。滚动列表时,选择是否仍保留在项目上? 是的,当然应该!如果移动选择会怎么样? 视图将滚动到新选择。如果按下轨迹球? 对当前选择采取行动!

他们仔细考虑&#34;显然也没有把这些重要信息放在哪里。这属于ListView的文档,而非博客文章。&lt; / rant&gt;

答案 1 :(得分:0)

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

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;
        }
    });

如果您有任何问题,请随时发表评论