如何在ListViews中识别重用的小部件

时间:2012-02-14 03:13:21

标签: android android-layout dynamic android-listview android-preferences

我认为这是一个奇怪的困境,虽然是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。“

所以我把它添加到我的布局中:

......但这种方式没有任何区别。

1 个答案:

答案 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视图来回收视图,因此在这种情况下,您一次只能参考屏幕上的视图。

此外,关于SharedPreferencesListView中的所有视图都由Adapter子类填充,该子类是将值放入{{1}的实际对象}和Checkbox小部件。此TextView包含您提供的数据集。为什么不直接引用数据集中的值,而不是尝试从任何情况下从数据集填充的列表项中找到它们?当有人点击Adapter时,您可以从ListView写入数据集,这样您就可以轻松有序地引用CheckBox中的所有项目。


更新:添加虚拟源代码

行。让我们从一个假设列表开始。我们想在列表中显示五个项目。为简单起见,我假设每个人都有ListViewTextView。所以我的容器类是:

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)。

对任何错误道歉。没有做任何检查。