java - AsyncTask 之后 RecyclerView 未更新

标签 java android android-recyclerview

我有一个带有 RecyclerViewFragment。我的 fragment 调用 AsyncTask,请求完成后,任务返回到我的 fragment ,该 fragment 实现了 processFinish 方法。在我的 processFinish 中,我引用了一个全局 RV 对象并尝试更新其内容

@Override
public void processFinish(String output, String id) {
    switch (id){
        case "exchange": {
            Gson gson = new Gson();
            JsonReader reader = new JsonReader(new
                    InputStreamReader( new ByteArrayInputStream(output.getBytes()) ));
            Type type = new TypeToken<ExchangeResponse>(){}.getType();
            ExchangeResponse data = gson.fromJson(reader, type);
            homeRV.refreshDrawableState();
            // This add doesn't work...
            ((DisplayableAdapter)homeRV.getAdapter()).addItem(new ExchangeDisplayable(data));
        }
    }
}

这是我的 addItem 方法。

public void addItem(Displayable d){
    this.results.add(d);
    this.notifyItemInserted(results.size() - 1);
    this.notifyDataSetChanged();
}

如果我从 onViewCreated 更新适配器,它会很好地工作。但不是来自 processFinish。我在添加项目后立即停止了调试器,并且似乎引用没有丢失(就像其他发布了类似问题的人一样)。我的数据集的大小发生了变化,但视觉上没有任何反应。

编辑 - 我添加了定义 homeRVonViewCreated 和我的 onPostExecute

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    homeRV = getView().findViewById(R.id.rv_home);
    homeRV.setHasFixedSize(true);
    homeRV.addItemDecoration(new DividerItemDecoration(homeRV.getContext(), DividerItemDecoration.VERTICAL));
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this.getContext());
    homeRV.setLayoutManager(layoutManager);
    homeRV.setAdapter(new DisplayableAdapter(new ArrayList<Displayable>()));
    // This add works...
    ((DisplayableAdapter)homeRV.getAdapter()).addItem(new HomeDisplayable("Heads up", "this is where Heads Up info will be stored"));
    getExchangeRates();

}

在异步任务中:

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    response.processFinish(result, identifier);

}

最佳答案

删除 homeRV.setHasFixedSize(true); 并查看它是否有效。由于这一行,它不会更新 recyclerview 的宽度/高度,因此您看不到新项目。

有关 setHasFixedSize 如何工作的更多信息,请参见 here .

关于java - AsyncTask 之后 RecyclerView 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57347215/

相关文章:

java - 使用不同的包名在java中动态加载一个类

android - 有没有更安全的方法在 Android 项目中存储敏感字符串?

android - 不同尺寸设备上的ImageButton

java - 更新到 API 27 后 RecyclerView Adapter 出现问题

java - 在修改java中的条目集值时同步对静态 HashMap 的访问

java - 将 UTC 时间转换为手机本地时间

java - 我如何使用 ldap 和 spring security 获取登录用户的电子邮件

android - 无法实例化 fragment 确保类名存在,是公共(public)的,并且有一个空的公共(public)构造函数

android - 在 ViewPager 中使用 RecyclerView 的异步 Firebase 任务

Android:编译错误:任务 ':app:compileDebugJava'执行失败