Tôi đã xử lý một hành vi lạ trong Chế độ xem Recycler, nếu số lượt xem trong bộ điều hợp nhỏ, trong trường hợp của tôi với kích thước 5, các chế độ xem không được tái chế và onBindViewHolder không được gọi khi khung nhìn được cuộn trở lại màn hình. Ví dụ: nếu tôi tăng kích thước lên 10 chế độ xem, thì quá trình tái chế sẽ bắt đầu hoạt động và onBindViewHolder được gọi mỗi lần xem vào màn hình.RecyclerView không xem lại chế độ xem nếu số lượt xem nhỏ
XML
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeRefresh"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<!-- RECYCLER VIEW -->
<android.support.v7.widget.RecyclerView
android:id="@+id/eventsList"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
xem Recycler khởi
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
llm.setOrientation(LinearLayoutManager.VERTICAL);
eventsList.setLayoutManager(llm);
//Sets endless listener
scrollListener = new EndlessRecyclerOnScrollListener(llm,3,mLastDownloadedPage) {
@Override
public void onLoadMore(int current_page) {
Timber.d("Loading date for page: " + current_page);
mLastDownloadedPage = current_page;
//If it's showing cached don't download
if(showingCached)
return;
//Shows snackbar loading view
showSnackbarLoadingView();
//Gets events
getEvents(false);
}
};
//eventsList.addOnScrollListener(scrollListener);
//Set the adapter
mAdapter = new EventListAdapter(this,getActivity().getApplicationContext());
eventsList.setAdapter(mAdapter);
Các Adaptor
@Override
public EventHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
Timber.d("Create view holder pos: "+i);
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_events_row, viewGroup, false);
return new EventHolder(v,mListener);
}
@Override
public void onBindViewHolder(EventHolder eventHolder, int i) {
if(mBindListener != null)
mBindListener.onBind(eventHolder,i);
Timber.d("Bind view holder pos "+i);
Event event = eventList.get(i);
eventHolder.bindEvent(event);
//Sets the date
setDate(eventHolder.date, event);
//Sets the location
setLocation(eventHolder.distance,event);
}
Trong màn hình chỉ có 3 ảnh nhìn thấy được, với kích thước 5, khi tôi di chuyển tôi có thể thấy rằng createViewHolder
và bindViewHolder
được gọi cho vị trí 4 và 5, nhưng khi tôi di chuyển lên trên, chúng không được tái chế khi thoát khỏi màn hình. Tôi có thể xác nhận rằng bởi vì bằng cách ghi đè
@Override
public void onViewRecycled(EventHolder holder) {
super.onViewRecycled(holder);
Timber.d("onViewRecycled: "+holder.name);
}
không có thư nào được ghi lại. Tuy nhiên, nếu số lượt xem tăng ví dụ với kích thước 10, mọi thứ hoạt động tốt, các chế độ xem được tái chế và onBindViewHolder
được gọi cho mọi vị trí.
Đây có phải là hành vi bình thường không? Nếu đó là cách tôi có thể lưu trạng thái của chế độ xem mục, ví dụ trạng thái được kích hoạt, tôi sử dụng để lưu vị trí hoạt động trong một biến và sau đó sử dụng dòng này để kích hoạt chế độ xem khi nó vào màn hình bằng cách sử dụng phương pháp liên kết
holder.itemView.setActivated(pos == lastSelectedPos);
Cảm ơn này giải quyết nó –
Chỉ cần đề cập đến, khi tôi đào bên trong 'recyclerView.setItemViewCacheSize() ', giá trị mặc định cho bộ nhớ cache là ** 2 **. – kirtan403
Cảm ơn bạn kirtan403 Tôi đã tìm mọi nơi cho điều đó. – esfox