我已经按照以下方式使用自定义适配器实现了我的RecyclerView
:
全局声明如下:
private LinearLayoutManager linearLayoutManager;
private int pastVisibleItems, visibleItemCount, totalItemCount;
private CustomRecyclerViewAdapter customRecyclerViewAdapter;
首先在onCreate()
方法中创建了适配器实例,其中包含一个空的Array
,并将其设置为recyclerView
linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(
Utility.ItemDecorationConst);
recyclerView.addItemDecoration(dividerItemDecoration);
customRecyclerViewAdapter = new CustomRecyclerViewAdapter(getActivity());
recyclerView.setAdapter(customRecyclerViewAdapter);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
visibleItemCount = linearLayoutManager.getChildCount();
totalItemCount = linearLayoutManager.getItemCount();
pastVisibleItems = linearLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
loading = false;
customRecyclerViewAdapter.addProgressBarEntry();
controller.getNextPage(PublisherAppContainerFragment.this);
}
}
}
});
在完成视图渲染后,当我从 AsyncTask
中获取数据以填充 recyclerView
时,我调用 Adapter
的以下方法来填充数据
customRecyclerViewAdapter.addAll(myArray);
注意:addAll()不是任何重写的方法
以下是我的CustomRecyclerViewAdapter
的代码
class CustomRecyclerViewAdapter extends RecyclerView.Adapter<CustomRecyclerViewAdapter.ViewHolder> {
ArrayList<MyModel> arrayList = new ArrayList<>();
Context context;
public CustomRecyclerViewAdapter(Context context) {
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewHolder viewHolder = null;
//inflated some view
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//binded data to holder
}
@Override
public int getItemCount() {
return arrayList.size();
}
public void addAll(ArrayList myArray) {
this.arrayList.addAll(myArray)
}
public void clear() {
arrayList.clear();
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public CardView cardView;
public ViewHolder(View view) {
super(view);
this.cardView = (CardView) view.findViewById(R.id.card_view);
this.cardView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
//handle operations
}
}
}
所以每当我从 AsynTask
获取数据时,我调用方法 addAll()
,recyclerView
就像魔法一样正常工作。
现在,我的问题是即使我从未在 adapter
上调用过 notifyDataSetChanged()
,它为什么能够正常工作?是否有为适配器注册的观察者?观察者对在 public int getItemCount()
中返回的数据集是否发生更改进行观察?
根据我从 documentation
中读到的:
void notifyDataSetChanged ()
通知任何已注册的观察者数据集已更改。
这意味着即使有一些已注册的 observers
,你也需要使用 notifyDataSetChanged()
来 notify
它们。对吗?
我也调用了
boolean flag = customRecyclerViewAdapter.hasObservers();
想知道是否有任何观察者已注册?Flag
是 True
。
所以请问有人可以帮我理解这些东西是如何工作的吗?