如何在ListAdapter(ListView)中使用ArrayLists?

时间:2013-05-23 13:49:04

标签: android listview listadapter

我找到了一个关于在an​​droid中使用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());

        }

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

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

再见

2 个答案:

答案 0 :(得分: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;
  }
});

答案 1 :(得分:0)

我不完全确定我理解你的问题。在那里打开包装有很多,但我会试一试。要了解发生了什么,您需要了解ListViewListAdapter中包含的数据之间的关系。

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

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

你怎么知道你总是使用正确的ArrayList?因为您的ArrayListListAdapter相关联。 ListAdapter提供ArrayList进程的数据,无论是模型列表还是用户,都由ListAdapter提供。你不能使用错误的。 ListView也是如此。因为您必须设置onCheckChanged链接的适配器,它将始终从正确的源提取。您不能使用错误的数据。

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

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

查看ArrayAdapter的文档 并为ListView

ListView的构造函数都将一些对象列表作为参数。此列表将是将在ListView

中显示的对象列表

此外,setAdapter要求您调用ListAdapter,其中包含ListView个参数。这实际上是告诉List它将要显示的数据源。

从这个意义上说,ListAdapterListView和{{1}}都链接在一起。