我认为这是一个奇怪的困境,虽然是YMMV。
我正在使用一个描述ListView中每一行/行的布局文件(没有什么太奇特了)。我为每个人分配了一个ID,例如:
机器人:ID = “@ + ID / checkBox1”
机器人:ID = “@ + ID / checkBox2”
机器人:ID = “@ + ID / checkBox3”
android:id =“@ + id / contactLabel”//一个TextView
现在这似乎没有意义,因为这些id应该是唯一的,所以第二个id是多少 行?也就是说,如果“第1行”遵循checkbox1,checkbox2,checkbox3和contactLabel的指定ID,那么“第2行”ID将是什么?
我很好奇,但我也需要知道,因为我想将复选框的值保存到SharedPreferences对象。
谁知道如何解决这个问题?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 更新
我需要解决的第一件事是如何响应ListView上的点击。这是我目前与这一切相关的难题:
ListView不知道它已被点击,或者不会告诉我
我已将此事件处理程序添加到ListActivity中:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
String item = (String) getListAdapter().getItem(position);
Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show();
}
......但它没有被调用。我点击显示的联系人,但没有去。
我也是这样试过的:
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(),
"Click ListItem Number " + position, Toast.LENGTH_LONG)
.show();
}
});
...仍然没有快乐......我在两个“Toast”行上都设置了断点,但它们永远不会被触及。
我在这里读到:
http://www.vogella.de/articles/AndroidListView/article.html#listsactivity_layout
...,“如果您需要更多活动中的ListView,您可以使用自己的布局 ListActivity“。
...我这样做,因为除了listview之外我还添加了页眉和页脚。
接着说,“在这种情况下,你的布局必须有一个带有android:id的ListView元素 属性设置为@android:id / list。“
所以我把它添加到我的布局中:
......但这种方式没有任何区别。
答案 0 :(得分:1)
当您使用ListView
方法对其进行充气时,getView()
窗口小部件中的项目的ID会通过其父视图引用。
详细说明,你可以使用ListView
适配器。
public View getView(int position, View convertView, ViewGroup viewGroup) {
if (convertView == null) {
convertView = LayoutInflater.from(ctx).inflate(R.layout.list_view_item, null);
}
Nown,一个新的视图实例作为convertView存在。您可以使用covertView.findViewById(R.id.checkBox1)
,convertView.findViewById(R.id.checkBox2)
等
这些观点中的每一个都是您ListView
的孩子。您可以使用ListView
对象中的getChildCount()
和getChildAt()
方法从ListView
引用每个单独的视图。
但是,由于建议使用convertView
视图来回收视图,因此在这种情况下,您一次只能参考屏幕上的视图。
此外,关于SharedPreferences
,ListView
中的所有视图都由Adapter
子类填充,该子类是将值放入{{1}的实际对象}和Checkbox
小部件。此TextView
包含您提供的数据集。为什么不直接引用数据集中的值,而不是尝试从任何情况下从数据集填充的列表项中找到它们?当有人点击Adapter
时,您可以从ListView
写入数据集,这样您就可以轻松有序地引用CheckBox
中的所有项目。
更新:添加虚拟源代码
行。让我们从一个假设列表开始。我们想在列表中显示五个项目。为简单起见,我假设每个人都有ListView
和TextView
。所以我的容器类是:
Checkbox
现在在我想要显示此列表的class Item {
String textView;
boolean checked;
}
中,我将Activity
项(您可以使用任何数据结构)作为类变量。然后我获取ListView引用并为其分配适配器。
ArrayList
如果要检索单击的项目,只需遍历Item类并查找哪些是真的,或者在class MyActivity extends Activity {
ArrayList<Item> listItems;
.....
onCreate(Bundle icicle) {
.....
ListView listView = (ListView) findViewById(R.id.listView1); // this will be you list view
MyAdapter listAdapter = new MyAdapter();
listView.setAdapter(listAdapter);
....
// Rest of your Activity
....
MyAdapter extends BaseAdapter {
int getItemCount() {
return listItems.size();
}
Item getItem(int position) {
return listItems.get(position);
}
View getView(int position, View convertView, ViewGroup parent) {
// Here's the important part
Item currentItem = listItems.getItem(position); // Since the array is a class variable, you can do either get or getItem
..... // do the standard individual item inflating ....
checkbox = convertView.findViewById(R.id.checkbox);
checkbox.OnItemSelectedListener( new OnItemSelectedListener() { // or whatever listener there should be... I didn't check
... // do whatever...
currentItem.setChecked(true);
}
中执行所需的任何操作,因为您有一个标识ListView的各个成员的引用dataset(此处为listItems ArrayList)。
对任何错误道歉。没有做任何检查。