【问题标题】:Replace all entries in list adapter替换列表适配器中的所有条目
【发布时间】:2014-06-11 11:09:46
【问题描述】:

谁能解释一下为什么下面的代码不起作用? 每次用户使用以下代码单击刷新按钮时,我都会尝试更新我的报告列表

updateReports(在所有的数据下载和解析之后):

reportsList = newReportsList;
listAdapter.notifyDataSetChanged();

以前在onCreateView:

listAdapter = new ReportsListAdapter(activity, R.layout.list_item_reports, reportsList);
listView.setAdapter(listAdapter);

但列表不会刷新并继续显示旧报告。我尝试使用listAdapter.clear()listAdapter.add() 使用for(我不能使用addAll,因为我需要使用API​​ 10),但它给了我一个空指针异常。

有什么策略可以以最简洁的方式进行这种替换吗?

【问题讨论】:

    标签: android android-listview listadapter


    【解决方案1】:
    reportsList = newReportsList;
    listAdapter.notifyDataSetChanged();
    

    不起作用,因为您只是将引用 reportsList 更新为对 newReportsList 的引用。这不会更新适配器的引用(对原始数组的原始引用)

    您的第二种方法应该可行,但您需要发布课程代码并提供NullPointerException 的详细信息。

    【讨论】:

    • 感谢您的解释!您认为第二种方法是正确的方法吗?在我看来有点脏:/
    • 另一种选择是创建一个新的ReportsListAdapter,但您已经有了一个。在这种情况下,我会说清除列表并添加新的对象数据是正确的方法。正如您所提到的,从 API 11 开始,您可以使用 addAll(...),这会稍微整理一下。我假设您不能仅根据当前数据和新数据之间的差异来添加/删除/更新。
    • 谢谢。我将把这个问题搁置几天,看看是否有其他人提出不同的意见,好吗? :)
    【解决方案2】:

    首先检查你的方法 updateReports 是否真的在下载后被调用。 第二次检查您的报告列表是否确实更改了内容,您可以简单地在使用 newReportsList 分配之前和之后记录它的值。

    【讨论】:

    • 我已经试过了,谢谢。调用该方法并更改值。
    【解决方案3】:
    reportsList.clear();
    reportsList.addAll(newReportsList);
    listAdapter.notifyDataSetChanged();
    

    这应该可以工作

    【讨论】:

      【解决方案4】:

      这不是我想要的解决方案,但在找到问题的解释之前,我将重置适配器:

      reportsList = newReportsList;
      listView.setAdapter(listAdapter);
      

      更多信息和方法在这里: Android List view refresh

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-23
        • 2014-08-22
        • 2022-12-22
        • 1970-01-01
        • 2019-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多