Vì vậy, tôi đang phải đối mặt với một vấn đề lạ trong khi thực hiện RecyclerView trong dự án của tôi. Tôi có một trang trí tùy chỉnh để thực hiện một padding trên và dưới phù hợp và một giá trị khá khác nhau của padding ở giữa các phần tử. Bất cứ khi nào tôi gõ vào làm mới, tức là lấy dữ liệu từ back-end và cư lại RecyclerView một lần nữa, padding tăng lên và nó tiếp tục tăng trên mỗi refresh.RecyclerView trang trí thêm đệm thêm vào làm mới
Khi tôi nhấn refresh (gây AsyncTask để thực hiện một lần nữa), khoảng cách giữa các mặt hàng tăng. Và nó tiếp tục tăng với mỗi lần làm mới.
Tôi có một RecyclerView điển hình như
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false"
android:focusableInTouchMode="false">
</android.support.v7.widget.RecyclerView>
Populating nội dung này bên RecyclerView là CardView với cách bố trí như sau:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/cv"
android:layout_marginLeft="9dp"
android:layout_marginRight="9dp"
>
<RelativeLayout
android:id="@+id/itemLinearTop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="17dp"
android:paddingRight="10dp"
android:paddingLeft="10dp">
<TextView
android:id="@+id/tv1"
android:textColor="@color/logo_black"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/tv1"
android:textColor="@color/logo_black"
android:layout_alignParentRight="true"
android:textAppearance="?android:attr/textAppearanceMedium" />
<!-- More elements -->
</RelativeLayout>
</android.support.v7.widget.CardView>
Tôi khởi tạo và Populating RecyclerView như thế này:
// In PostExecute of AsyncTask
RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.recyclerview);
RecycleViewAdapter adapter = new FuelPricesRecycleViewAdapter(data);
rv.setAdapter(adapter);
rv.addItemDecoration(new RecyclerViewItemDecoration(30, item_count - 1));
Và đây là những gì lớp RecyclerViewItemDecoration của tôi trông giống như:
public class RecyclerViewItemDecoration extends RecyclerView.ItemDecoration {
private int space = 0;
private int item_count = 0;
private int ADDITIONAL_PADDING = 20;
public RecyclerViewItemDecoration(int space, int item_count) {
this.space = space;
this.item_count = item_count;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if(parent.getChildPosition(view) != item_count)
outRect.bottom = space;
// Add top margin only for the first item to avoid double space between items
if(parent.getChildPosition(view) == 0)
outRect.top = space + ADDITIONAL_PADDING;
if(parent.getChildPosition(view) == item_count)
outRect.bottom = space + ADDITIONAL_PADDING;
}
}
Cảm ơn bạn đã giúp đỡ của bạn!
bất cứ điều gì bạn đã tìm thấy? – codevscolor
Gần một năm sau, tôi phải đối mặt với cùng một vấn đề mà bạn gọi RecyclerView.scrollToPosition() sau khi làm mới? – Fraid
Xin chào, bạn đã tìm được giải pháp chưa? Hiện tại tôi đang gọi 'adapter.notifyItemRangeChanged (0, adapter.getItemCount(), emptyList());' như một giải pháp thay thế.Điều này sẽ làm mất hiệu lực tất cả các mục mà không cần rebinding các khung nhìn vì có một tải trọng. (tải trọng có thể là bất kỳ đối tượng không null nào). Tôi vẫn muốn tìm một cách tốt hơn. –