如何从ListView获取所选项目?

时间:2011-01-29 02:28:49

标签: android listview

在我的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);

这很好用,列表已填充等等,但是当我尝试访问所选项时,我会收到一个Null对象。我用

完成了这个
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 个答案:

答案 0 :(得分:43)

默认情况下,当您单击ListView项时,它不会将其状态更改为“已选中”。所以,当事件发生时你会这样做:

myList.getSelectedItem();

该方法没有任何要返回的内容。你要做的是通过这样做来使用位置并获得底层对象:

myList.getItemAtPosition(position);

答案 1 :(得分:20)

您正在实施Click Handler而不是Select Handler。默认情况下,列表不会选择。

在上面的例子中,你应该改变的是

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

答案 2 :(得分:6)

onItemClick

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

答案 3 :(得分:6)

由于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参数实际上为您提供所选项目的位置。

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

touch mode中,没有焦点也没有选择。您的UI应使用不同类型的窗口小部件,例如单选按钮,以供选择。

ListView上有关这方面的文档非常糟糕,只是在setSelection上提到了一个模糊的内容。

答案 7 :(得分:0)

尽管我使用的是 kotlin ,但以下代码回答了您的问题。这将返回选择的项目:

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

以下是整个选定项目的侦听器

myListView.setOnItemClickListener(object : OnItemClickListener {
       override fun onItemClick(parent: AdapterView<*>, view: View, i: Int,
                        id: Long) {
           val item = myListView.adapter.getItem(i).toString()

       }
    })

代码返回其索引i单击的项目,如代码所示

答案 8 :(得分:-2)

  

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

你从未实例化过你的课程。