0

)

我找到了一个关于在 android 中使用 ListView 的教程。但我有一个问题。这里的教程:

http://www.vogella.com/articles/AndroidListView/article.html#listadvanced_interactive

您必须滚动到第 13.2 节。

本教程的想法是一方面您有一个 ListView(每个项目中都有复选框),另一方面您有一个 ArrayList(ArrayList 的项目是对象,其中包含显示在ListView,例如 CheckBox 是否选中,文本等)。适配器应该保持两者相等。如果更改 ArrayList,ListView 也会更改。

但现在我的问题。如果用户触摸列表中的一项,适配器将调用方法“onCheckedChanged”。但是那里发生了什么?一个对象将在那里创建并从 CheckBox 中获取一个标签。好的。现在方法完成了。垃圾收集器会销毁对象还是不销毁?我什么时候需要在我的活动中从那里获得这些信息。想象一下,我的列表下方有一个“删除”按钮。所以我必须将这些信息从适配器的侦听器传输到我的 Activity。如何确保在每个类中使用相同的 ArrayList 和正确的信息?

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
          Model element = (Model) viewHolder.checkbox
              .getTag();
          element.setSelected(buttonView.isChecked());

        }

我希望你知道我的意思。你能给我解释一下吗?

对不起语言,但英语不是我的母语。

再见

4

2 回答 2

0

我不完全确定我理解你的问题。里面有很多东西要解压,但我会试一试。要了解发生了什么,您需要了解ListView和支持它的数据之间的关系,该数据包含在ListAdapter.

显示ListView包含在ListAdapter. ListAdapter从其他来源获取数据,在这种情况下,它是ArrayList您所指的。为什么使用ArrayList? 在本教程中,它并不完全清楚,因为该示例使用了一组固定的数据(例如操作系统列表),这些数据以字符串形式写出。然而,在实践中,您经常使用动态列表,例如用户列表、地点列表等。

ArrayList保存最终将显示的对象。这是教程中的“模型”类。这同样适用于任何其他类别的数据,例如地点列表。如果您将地点想象为一个类,那么该类将包含描述该地点的字段(例如地址、描述、一些其他独特的特征)。当从某个位置下载数据时,将为每个位置创建一个新的地点实例。这些对象将被收集在一个ArrayList. 下载过程完成后,您将开始将其内容传递给的过程,ArrayList以便ListAdapter最终ListView可以更新。

你怎么知道你将永远使用正确的ArrayList?因为你ArrayList与你有关ListAdapter。进程的数据ListAdapter,无论是模型列表还是用户列表,都由ArrayList. 你不能使用错误的。对于ListAdapter. 因为您必须设置所ListView链接的适配器,所以它将始终从正确的源中提取。您不能使用错误的数据。

onCheckChanged如果您密切注意,侦听器发生的事情是用户实际上只是在更新模型类中包含的字段。每个模型都有一个 isChecked 字段。单击该复选框时,该对象的值将被更新。这就是你如何知道什么被检查,什么没有被检查。

回应:“没有人告诉适配器“嘿,它属于列表,这是你的来源”

查看ArrayAdapterListView的文档

all的构造函数ArrayAdapter将一些对象列表作为参数。此列表将是将显示在ListView.

此外ListView,您调用的要求setAdapter将一些ListAdapter作为其参数。这实际上告诉了ListView它要显示的数据的来源。

从这个意义上说,ListListAdapterListView都链接在一起。

于 2013-05-23T14:14:47.570 回答
0

如果我理解你的问题,答案在你给出的教程的第 14.1 章中......

如果您想在检查删除时进行一些处理,您可以在 ListView 中添加一个侦听器。

这些函数通常会点击位置,您可以在知道点击位置的情况下做任何您想做的事情。举个例子:

list.setOnItemLongClickListener(new OnItemLongClickListener() {

  @Override
  public boolean onItemLongClick(AdapterView<?> parent, View view,
      int position, long id) {
    Toast.makeText(MyList.this,
        "Item in position " + position + " clicked",
        Toast.LENGTH_LONG).show();
    // Return true to consume the click event. In this case the
    // onListItemClick listener is not called anymore.
    return true;
  }
});
于 2013-05-23T14:03:32.140 回答