在我的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
}
似乎有什么问题?谢谢
答案 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(); //
你从未实例化过你的课程。