2015-07-02 19 views
10

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

This is the correct way

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.

Padding between items increasing

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!

+0

bất cứ điều gì bạn đã tìm thấy? – codevscolor

+0

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

+0

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. –

Trả lời

4

Bạn đang thêm Decoration mỗi lần recyclerview được tải.

Sử dụng một lá cờ thay vì:

private flagDecoration = false; 

if(!flagDecoration) 
{ 
    rv.addItemDecoration(new RecyclerViewItemDecoration(30, item_count - 1)); 
    flagDecoration = true;  
} 
+0

Không, nó không hoạt động. –

+0

Tôi đã sử dụng tệp trang trí này: https://gist.github.com/alexfu/0f464fc3742f134ccd1e – codevscolor

5

Bạn cần phải loại bỏ các trang trí mục trước khi Reseting dữ liệu mới.

rv.removeItemDecoration(yourDecorator)

Hãy cho tôi biết nếu nó hoạt động!

+0

Điều này đã giải quyết được sự cố của tôi, cảm ơn ^^ – devchimp

0

tôi đã phải đối mặt với cùng một vấn đề, giải pháp tốt nhất là làm cho trang trí mục của bạn trong khi bạn đang khởi tạo quản lý bố trí của bạn trong người giữ quan điểm, điều này giải quyết vấn đề bạn đang phải đối mặt với dụ

public class GridViewHolder extends ViewHolder { 

    RecyclerView grid_list; 

    public GridViewHolder(View v) { 
     super(v); 
     this.grid_list = (RecyclerView) v.findViewById(R.id.home_screen_item_grid_recycler_view); 
     if (grid_list.getLayoutManager() == null) { 
      RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(context, 4); 
      grid_list.setLayoutManager(mLayoutManager); 
      grid_list.addItemDecoration(new GridSpacingItemDecoration(4, 3, false)); 
     } 
    } 
} 
1

Phải đối mặt với cùng một vấn đề và giải quyết nó bằng cách đặt

mLayoutManager = new LinearLayoutManager(current_activity); 
recyclerView.setLayoutManager(mLayoutManager); 

trong phương thức onPreExecute().

Chỉ cần thử nếu nó hoạt động

0

Tôi gặp phải vấn đề tương tự. Khắc phục sự cố nếu kiểm tra

if (recyclerView.getItemDecorationAt(0) == null) { // check decoration here 
     FlexboxItemDecoration agentDividerItemDecoration = new FlexboxItemDecoration(rv.getContext()); 
     agentDividerItemDecoration.setDrawable(recyclerView.getContext().getResources().getDrawable(R.drawable.shape_divider_flex_normal)); 
     recyclerView.addItemDecoration(agentDividerItemDecoration); 
    } else { 
     Log.i(TAG, "initTagsView: ItemDecoration not null"); 
    } 
Các vấn đề liên quan