【问题标题】:Android ListView: how to select an item?Android ListView:如何选择一个项目?
【发布时间】:2012-04-17 16:08:07
【问题描述】:

我在创建 ListView 时遇到问题:我希望在单击某个项目时将其选中。

我的代码如下:

protected void onResume() {
...
ListView lv = getListView(); 
lv.setOnItemSelectedListener(new OnItemSelectedListener() 
{
    public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long id) {
        Log.v(TAG, "onItemSelected(..., " + pos + ",...) => selected: " + getSelectedItemPosition());
    }
    public void onNothingSelected(AdapterView<?> adapterView) {
        Log.v(TAG, "onNothingSelected(...) => selected: " + getSelectedItemPosition());
    }
});
lv.setOnItemClickListener(new OnItemClickListener()
{
    public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) {
        lv.setSelection(pos);               
        Log.v(TAG, "onItemClick(..., " + pos + ",...) => selected: " + getSelectedItemPosition());              
    }
});
...
}

当我运行它并单击例如在第二项(即 pos=1)上,我得到:

04-03 23:08:36.994: V/DisplayLists(663): onItemClick(..., 1,...) => selected: -1

即即使使用正确的参数调用 OnItemClickListener 并调用 setSelection(1),也没有选择项目(因此也永远不会调用 OnItemSelectedListener.onItemSelected(...))并且 getSelectedItemPosition() 在 setSelection 之后仍然产生 -1 (1)-调用。

我错过了什么?

迈克尔

PS.:我的列表确实有 >=2 个元素...

【问题讨论】:

    标签: android android-widget android-listview


    【解决方案1】:

    这里缺少的元素是choiceMode。这不是很好documented,但默认情况下,android 中的 ListViews(以及从 AbsListView 继承的任何东西,如 GridView 等)默认不允许选择,但可以启用它 - 无论是在 XML 中还是在代码:

    在 XML 中:

    <ListView
      ...
      android:choiceMode="singleChoice" />
    

    代码:

    mListView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
    

    注意,一旦你这样做了,android 会为你setSelection(),所以你不需要自己去跟踪它。那时你的 onClickListener 只是为了保存选择,我什至不打扰 OnSelectedItemListener :

    @Override
    public void onItemClick(final AdapterView<?> list, final View v,
        final int position, final long id) {
      Participant p = mAdapter.getParticipantForId(id);
      eventManager.fire(new ParticipantSelectedEvent(p));
      pxList.smoothScrollToPosition(position); // Make sure selection is plainly visible
    }
    

    【讨论】:

    • 为什么这被否决了,究竟是什么?它解决了 getSelectedItemPosition() 永远不会改变的海报问题。是的,如果他想要的只是有问题的项目,那么 onItemClick() 中的 getItemAtPosition 肯定更容易。然而,choiceMode 是为了能够向用户显示当前选择了哪个项目,并允许程序员访问它。
    • 我添加了描述的选择模式(在两种变体中),但没有变化! OnItemClickListener 仍然没有被调用。即使我在屏幕上得到了反应,即该项目很快变成紫色,然后又变回白色。奇怪的是,我可以通过点击向上和向下按钮来选择项目(然后调用 OnIemSelectListener),但显然不能通过 OnItemClickListener。
    • 等等,所以 OnItemClick 永远不会被调用?? OnItemSelect 侦听器仅配置为 trackPad/up down 的东西 - 它不响应点击,我不知道它是否会响应 setSelection 的手动调用
    • 因为您正在使用具有混合控件的手机,如果需要,您可能必须让 onItemSelected() 调用和 onClick() 调用都指向相同的函数(您定义的)两个事件的相同功能。在触摸模式和非触摸模式下工作有一些怪癖,我真的不太了解。
    • 更奇怪的是: OnItemClick 确实 被调用(位置正确)。它调用 setSelection(pos),它被忽略(即它没有任何效果。在调用之后 selectedItemPosition 仍然是 -1)。
    【解决方案2】:

    试试这个:--

        ListView lv = getListView();
    
        lv.setOnItemClickListener(new OnItemClickListener() {
          public void onItemClick(AdapterView<?> parent, View view,
              int position, long id) {
    
              // selected item
              String product = ((TextView) view).getText().toString();
    
             Toast.makeText(getApplicationContext(), "Selected Item :" +product, Toast.LENGTH_SHORT).show();
    
          }
        });
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      我刚刚意识到,我完全不在了。在触摸模式下,选择一个项目根本没有意义。您只需在单击时直接对其进行操作(并调用 OnClickListener is)。 我刚刚开始意识到,Android 可以处理所有这些不同的设备,它们有方向控制按钮、触摸屏等。很难想象,如何在不使用的设备上完成操作测试或不能测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多