RecyclerView没有更新OnPostExecute()上的项目

时间:2018-07-17 18:15:13

标签: java android multithreading android-recyclerview jsoup

在这里先向大家问候。

在寻找解决方案的过程中,我一直在问题和疯狂之间徘徊,我已经投入了更多的时间来解决自己的困境,现在我需要在该领域最知识渊博的人来帮助我。

正如我在下面详细介绍的,我正在做或至少试图做的是更新RecyclerView,同时我正在收集保存在DB和{{ 1}}。

我要在list of elements中绘制的数据,是通过以下方式获得的:使用RecyclerView,我首先获得一个链接列表,然后使用rssparser,我得到新闻的图片和文字。

碰巧,必须在Jsoup内部调用这些与网络交互的函数,而不是UI的那些函数,很好,我相信我在那里创建的就像多线程一样,并且很好我可以在异步任务中完成这种数据获取。

我需要做的另一件事是维持此视图中的threads,直到线程处理完成为止。理想情况下,它可以实时工作,我已经做到了,但是对我来说不行,方法是将每个新元素添加到列表中,然后将新插入的项目通知适配器。

当任务处理结束并且线程完成其工作时,我也不用progress bubble更新RecyclerView,我也不知道还有什么尝试,也许我有一些算法错误。

下面我要放我的代码,对我的足迹表示歉意,请确保我留下了一些不必要的代码或注释。

片段:

adapter.notifyDatasetChanged()

2 个答案:

答案 0 :(得分:1)

您不是在onPostExecute()方法中不是 更新任何适配器数据并调用notifyDatasetChanged

@Override
protected void onPostExecute(String result) {
   adapter.notifyDataSetChanged();
   isAlreadyRefresh = true;
   swipeView.setRefreshing(false);
}

在更新适配器数据时,您只需<{>} 呼叫adapter.notifyDatasetChanged()

我看到您已通过onRefresh()方法更新了适配器数据,但尚未调用adapter.notifyDatasetChanged()。因此,您需要添加 notifyDatasetChanged ,如下面的代码所示。

@Override
public void onRefresh() {
    if (!isAlreadyRefresh) {
        swipeView.setRefreshing(true);
        swipeView.postDelayed(new Runnable() {
            @Override
            public void run() {
                fetchNews();
                isAlreadyRefresh = true;
                adapter.setmValues(news);
                adapter.notifyDatasetChanged() // <- Add this
            }
        }, 1000);
    } else
        swipeView.setRefreshing(false);
}

这可能是您的RecyclerView未更新的原因之一

答案 1 :(得分:1)

除了adityakamble49的答案。该问题可能位于GoScrapp函数内部:

 if(!esta) {
        Foo foo = new Foo(article);
        Thread th = new Thread(foo);
        try {
            th.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

您正在doInBackground()内部启动一个新线程来处理数据并更新数据库,因此在线程将数据插入数据库之前执行onPostExecute()。