Я внедрил свой RecyclerView
с ним Custom Adapter
следующим образом
Глобальные декларации следующим образом
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);
note: 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
работает как шарм.
Теперь, мой вопрос заключается в том, как он работает очень хорошо, хотя я никогда не вызывал notifyDataSetChanged()
на adapter
. Есть ли ранее зарегистрированные наблюдатели для адаптера? кто наблюдает, был ли изменен набор данных, который был возвращен в public int getItemCount()
?
Как я читал из documentation
void notifyDataSetChanged()
Сообщите зарегистрированным наблюдателям, что набор данных изменился.
это означает, что хотя есть зарегистрированные observers
вам необходимо notify
их, используя notifyDataSetChanged()
. Правильно?
Я также позвонил
boolean flag = customRecyclerViewAdapter.hasObservers();
знать, зарегистрированы ли какие-либо наблюдатели? Flag
True
.
Так кто угодно, пожалуйста, помогите мне понять, как именно эти вещи работают?