我最初使用空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();
}
答案 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();
}
});