空循环器视图未使用新数据进行更新

时间:2016-10-12 03:22:57

标签: android android-recyclerview recycler-adapter

我最初使用空arraylist初始化我的Recycler视图适配器。 然后,一旦我从API获取数据,我尝试通过调用notifyDataSetChanged()来更新适配器,但我的适配器中的回调方法都没有被解雇

void initRecyclerView() 
    {     
            myList = new ArrayList<>();
            myRecyclerAdapter = new myRecyclerAdapter(getActivity(), myList, "");
            myRecyclerView.setAdapter(myRecyclerAdapter);
            linearLayoutManager = new LinearLayoutManager(getActivity());
            myRecyclerView.setHasFixedSize(true);
            myRecyclerView.setLayoutManager(linearLayoutManager);
    }

从API获取数据后,我只需更新适配器,如下所示:

void updateRecyclerView(ArrayList<Data> newList)
   {
        if (myList.isEmpty())
                    linearLayoutManager.removeAllViews();
                myList.clear();
                myList.addAll(newList);             
                myRecyclerAdapter.notifyDataSetChanged();
   }

3 个答案:

答案 0 :(得分:3)

void updateRecyclerView(ArrayList<Data> newList)
   {
//you don't have to removeviews
      //  if (myList.isEmpty())
                 //    linearLayoutManager.removeAllViews();
                myList.clear();
                myList.addAll(newList);             
                 myRecyclerAdapter.notifyDataSetChanged();
   }

答案 1 :(得分:2)

我犯了一个最昂贵的错误并思考其他问题,而不是在不同方面看待它。

我有SwipeRefreshLayout包裹RecyclerView

我应该在通过API调用下载数据后使用setRefreshing(false)。相反,我使用了setVisibility(VIEW.GONE) on my mSwipeRefreshLayout`。

SwipeRefreshLayout的可见性更改影响了RecyclerView

我希望没有人会犯这个错误。也许有人可能会遇到这个最小的错误,所以我把答案标记为已接受的答案。

答案 2 :(得分:1)

首先尝试设置布局管理器,然后将适配器设置为list:

void initRecyclerView() 
{     
        linearLayoutManager = new LinearLayoutManager(getActivity());
        myRecyclerView.setHasFixedSize(true);
        myRecyclerView.setLayoutManager(linearLayoutManager);
        myList = new ArrayList<>();
        myRecyclerAdapter = new myRecyclerAdapter(getActivity(), myList, "");
        myRecyclerView.setAdapter(myRecyclerAdapter);
}

另外请注意,如果您想更改数据集或通知您的适配器有关更改,您应该在主线程中执行此操作。

runOnUiThread(new Runnable() {
@Override
public void run() {
     myList.clear();
     myList.addAll(newList);             
     myRecyclerAdapter.notifyDataSetChanged();
}
});