【问题标题】:List<String> addAll() method not addingList<String> addAll() 方法未添加
【发布时间】:2016-04-09 20:42:56
【问题描述】:

我正在尝试直接更改数据源并将任何更改通知适配器。但是 addAll() 不会更新我的列表。在我的代码中似乎一切正常,但在运行期间却不行。请帮我更正代码。提前谢谢你。

    List<String> pgs = myClass.getPgs();
    List<String> tmppgs = pgs;

    /*
    .
     lots of code for string processing which results in >> String content for each i
    .
     */

    for (int i = 0; i < tmppgs.size(); i++) {
    tmppgs.set(i, content);
    }

    Toast.makeText(getActivity(),String.valueOf(tmppgs.size()), Toast.LENGTH_LONG).show();
    // Toast shows desired result which is OK.

    pgs.clear();
    pgs.addAll(tmppgs);
    Toast.makeText(getActivity(),String.valueOf(pgs.size()), Toast.LENGTH_LONG).show();
    //Unexpectedly shows zero

    mAdapter.notifyDataSetChanged();
}

【问题讨论】:

  • tmppgs == pgs。您正在清除两者。
  • 不,第一次吐司显示正确的结果。问题从 pgs.clear() 开始。
  • 只是猜测,你试过 List tmppgs = new ArrayList(pgs); ?

标签: java android arrays string android-recyclerview


【解决方案1】:

pgstemppgs 是同一个ArrayList 对象:

List<String> tmppgs = pgs;

因此,当您致电pgs.clear() 时,您正在清空该列表。 pgs.addAll(tmppgs) 将无效,因为您正在尝试将空列表的内容添加到自身。

目前尚不清楚您为什么要首先使用clear()addAll()。如果您的目标是通过set() 调用修改列表...您已经通过set() 调用修改该列表。只需注释掉 clear()addAll() 行(最后,去掉 tmppgs,因为你不再需要它了)。

【讨论】:

  • 感谢@CommonsWare 的回答。正如我所说,我需要直接对现有引用执行操作,因为重新初始化列表不会影响适配器,因为它具有对旧列表的内存引用。
  • @ab0001368:因此,按照我在答案第二段中写的操作。
  • 我直接修改了 pgs 而不是 tmppgs 解决了返回零大小的列表。但是 recyclerview 在更新项目时表现出意外。列表大小为 3(recyclerview 显示 3 个 webview)。第一项和第二项未更新。但是第三个 webview 中显示了 3 个更新的项目(3 个文本)!!!
  • @ab0001368:这听起来像是您的RecyclerView.AdapterRecyclerView.ViewHolder 中的错误,无论您在哪里更新项目。
  • 因为这个问题,我使用了 List tmppgs 并且在更新 pgs 之前,我清除了我面临 pgs 大小为零的问题。有什么方法可以纠正返回正确大小的 pgs.addAll(tmppgs) 吗?
【解决方案2】:

你可以改变

List<String> tmppgs = pgs;

List<String> tmppgs = myClass.getPgs();;

应该为你工作。

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多