2015-10-15 64 views
0

我给自己定的OnItemSelectedListener在我的自定义ExpandableListViewExpandableListView不叫OnItemSelectedListener

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 &回到2010年约OnItemSelectedListener不与ListView合作。我无法找到真正解释如何使其工作的解释。常见的答案是使用点击监听器。我想避免,如果可能的话,因为我需要的是选择什么时候知道的(即列表是空的),我想利用OnItemSelectedListener#onItemSelected(...)这个特点:

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

我可以通过其他方式实现这两种方式,但如果OnItemSelectedListener有效,它会更好。

编辑:看起来ExpandableListView是完全破坏的项目选择。当点击监听器调用,这个片段记录所选择的项目为-1:

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

我从来没有使用'OnItemSelectedListener'但它听起来像你想来自设定AbsListView'的'的ChoiceMode行为。虽然这对'ListViews'起作用,但对'ExpandableListViews'不起作用。 –

+0

https://github.com/JaySoyer/Advanced-Adapters提供了一个使用ChoiceMode和ExpandableListviews的解决方案。 –

回答

0

使用点击侦听器不仅仅是一个懒惰的解决方法。由于一些糟糕的设计决定,这是唯一的选择。 A blog post from 2008解释了为什么OnItemSelectedListener不起作用:

在触摸模式下,没有焦点并且没有选择。一旦用户进入触摸模式,网格中列表[sic]中的任何选定项目都将变为未选中状态。

它继续:

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

这样做的原因如下:

想象一下,一个简单的应用程序。 。 。显示文本项目的列表。用户可以使用轨迹球在列表中自由导航,还可以使用手指滚动并拖动列表。这种情况下的问题是选择。如果我在列表顶部选择一个项目,然后将列表向底部扔,那么选择会发生什么?它应该保留在物品上并滚动屏幕吗?在这种情况下,如果我决定用轨迹球移动选区会发生什么?或者更糟糕的是,如果我按下轨迹球来对当前选定的项目执行操作,该项目不再显示在屏幕上。仔细考虑之后,我们决定完全取消选择。

<咆哮>在回答这些问题,Android的开发者忽视了其他UI工具包和几十年的用户体验建立的约定。当列表滚动时,选择是否应保留在项目上? 是的,当然应该!如果您移动选择会发生什么? 视图将滚动到新的选择。如果你按下轨迹球? 就目前的选择采取行动!

他们的“谨慎考虑”显然不包括在哪里放置这些重要信息。这属于ListView的文档,不在博客文章中。 < /咆哮>

+0

当你说选择时,你的意思是明显突出显示?你应该依靠激活状态。又为此行为设置'setChoiceMode()'和'setItemChecked()'。我只使用'setSelection()'将项目滚动到'ListView'的顶部。有一个轨迹球,然后作用于激活/检查项目将需要手动写入。 –

+0

@JaySoyer我的意思是被选中的状态,这将通过对“OnItemSelectedListener”的回调来表示。我正在使用'CHOICE_MODE_SINGLE'。我将尝试扩展'ExpandableListView'来恢复触摸模式选择功能。 –

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

的评论感到自由,如果你有任何问题

+0

我在问题中解释了为什么点击监听器不合适。 –

+0

实际上使用用于OnItemSelectedListener的可扩展列表视图,它不适用于可扩展列表视图 –

+0

是否在'OnItemSelectedListener'不能与ExpandableListView一起使用? –