如何从ListView中获取所选项目?

31

在我的Android应用程序中,我创建了一个名为myList的ListView组件,并用自定义类型的对象填充了它:

class MyClass{

    private String displayName;
    private String theValue;
... //here constructor, getters, setters and toString() are implemented

}

我使用ArrayAdapter将ArrayList theObjects绑定到myList上:

ArrayAdapter<MyClass> adapter= 
                new ArrayAdapter<MyClass>(this, R.layout.lay_item, theObjects);
myList.setAdapter(adapter);
这个方法可以正常运行,列表也被填充了等等,但是当我尝试访问选定的项时,我收到了一个空对象。我是这样做的:


myList.setOnItemClickListener(new OnItemClickListener() {

   public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {

MyClass selItem = (MyClass) myList.getSelectedItem(); //
String value= selItem.getTheValue(); //getter method

}

有什么问题吗?谢谢

9个回答

46

默认情况下,当您单击ListView项时,它不会将其状态更改为“已选”。因此,当事件触发并执行以下操作时:

myList.getSelectedItem();

该方法没有任何返回值。你需要做的是使用位置并通过以下方式获取基础对象:

myList.getItemAtPosition(position);

2
那如何帮助找到所选项目的索引?首先,您将如何获得位置? - Zelphir Kaltstahl
@Zelphir 位置信息被传递到onItemClick(AdapterView<?> adapter, View v, int position, long id)方法中。 - RustyFluff

21

你正在实现点击处理程序而不是选择处理程序。默认情况下,列表不应该有选择。

在您上面的示例中,您应该更改的内容是

public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
    MyClass item = (MyClass) adapter.getItem(position);
}

8

由于onItemClickLitener()本身会提供所选项目的索引,因此您可以简单地执行getItemAtPosition(i).toString()。以下是代码片段:

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            String s = listView.getItemAtPosition(i).toString();

            Toast.makeText(activity.getApplicationContext(), s, Toast.LENGTH_LONG).show();
            adapter.dismiss(); // If you want to close the adapter
        }
    });

在上述方法中,i参数实际上给出了所选项的位置。


6

onItemClick 中:

String text = parent.getItemAtPosition(position).toString();

1
适用于 Xamarin :) - Matheus Miranda

3
myList.setOnItemClickListener(new OnItemClickListener() {
  public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
      MyClass selItem = (MyClass) adapter.getItem(position);
   }
}

3
使用setOnItemClickListener是正确的答案,但如果您有键盘,即使没有执行单击操作,也可以使用箭头更改选择,因此,您还需要实现setOnItemSelectedListener:
myListView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
     MyObject tmp=(MyObject) adapterView.getItemAtPosition(position);
         }
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                // your stuff
            }
        });

2
触摸模式下,没有焦点和选择。您的用户界面应该使用不同类型的小部件,例如单选按钮进行选择。
关于此问题,ListView 的文档很糟糕,只有一个关于setSelection的晦涩提及。

0

虽然我正在使用kotlin,但以下代码可以回答您的问题。这将返回所选项目:

val item = myListView.adapter.getItem(i).toString()

以下是整个selecteditem监听器。
myListView.setOnItemClickListener(object : OnItemClickListener {
       override fun onItemClick(parent: AdapterView<*>, view: View, i: Int,
                        id: Long) {
           val item = myListView.adapter.getItem(i).toString()

       }
    })

代码返回被点击的项目,其索引为i,如代码所示。

-1

你从未实例化你的类。

MyClass selItem = (MyClass) myList.getSelectedItem(); //


4
他说他能够查看这些东西,因此该类一定已经实例化了。 - xandy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接