2015-03-20 16 views
7

Tôi đang cố triển khai RecyclerView như một số UICollectionView trong iOS. Tôi muốn đặt contentInset ở cuối chế độ xem của người tái chế nhưng tôi không thể tìm thấy tùy chọn để thực hiện.Đặt contentInset trong RecyclerView

Có điều gì đó tương tự cho Android không?

Trả lời

6

Giải pháp rất đơn giản:

<android.support.v7.widget.RecyclerView 
    android:paddingBottom="30dp" 
    android:clipToPadding="false" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 
+0

Điều này. Giải pháp đơn giản nhất. –

0

Tôi đã giải quyết điều này bằng cách thêm một ô RecyclerView tùy chỉnh bổ sung một khoảng trống ở cuối chế độ xem với màu nền rõ ràng.

+0

Nó hoạt động ... nhưng có vẻ như sai ... Tôi đã đi cho cái thấy giống như không có bất kỳ lời đề nghị khác. Phải có một giải pháp tốt hơn mặc dù! – CMash

1

Tôi đã tạo bộ điều hợp bao bọc để đạt được điều này, cách ly mã độc đáo. Nhưng, tôi muốn có một giải pháp tốt hơn ..

public class HeaderSpaceWrapperAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private static final int TYPE_HEADER = 0x4711; 
    private int mSpace; 
    RecyclerView.Adapter mAdapter; 


    public HeaderSpaceWrapperAdapter(RecyclerView.Adapter adapter, int space) { 
     mAdapter = adapter; 
     mSpace = space; 

     mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
      @Override 
      public void onChanged() { 
       notifyDataSetChanged(); 
      } 
     }); 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if (viewType == TYPE_HEADER) { 
      return new ViewHolder(new Spacer(parent.getContext(), mSpace)); 
     } 

     return mAdapter.onCreateViewHolder(parent, viewType); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if (position > 0) { 
      mAdapter.onBindViewHolder(holder, position - 1); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return 1 + mAdapter.getItemCount(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position == 0 ? TYPE_HEADER : mAdapter.getItemViewType(position - 1); 
    } 

    private class ViewHolder extends RecyclerView.ViewHolder { 

     public ViewHolder(View view) { 
      super(view); 
     } 
    } 
} 

Sau đó sử dụng nó:

mWrapperAdapter = new HeaderSpaceWrapperAdapter(mAdapter, 100); 
mRecyclerView.setAdapter(mWrapperAdapter); 
0

Mặc dù câu hỏi này là hơn một năm cũ, tôi nghĩ rằng tôi muốn chia sẻ những gì tôi đã làm, ai đó có thể thích nó, hoặc chỉ không muốn gõ và có thể sao chép/dán này: D.

Giải pháp của tôi là thêm một số lề dưới vào mục cuối cùng.

Trước tiên tôi xác định rằng nó là mục cuối cùng:

@Override 
public void onBindViewHolder(final ItemViewHolder holder, int position) { 

    .... 
    Your other code 
    .... 

    // Check if it is the last item and the list is not empty. 
    if(position == mItems.size()-1) { 
     // If so, add some margin to the element 
     holder.setBottomMargin(R.dimen.last_item_offset); // some dimension (or set a fixed amount of pixels 
    } 
} 

Sau đó, tôi có một phương pháp trong viewholder để thiết lập lề dưới.

class ItemViewHolder extends RecyclerView.ViewHolder { 
    private View mRootView; 
    private Context mContext; 

    public ItemViewHolder(View itemView) { 
     super(itemView); 
     mRootView = itemView; 
     mContext = itemView.getContext(); 
     // do more stuff like binding views, etc 
    } 

    public void setBottomMargin(@DimenRes int margin){ 
     RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) mRootView.getLayoutParams(); 
     layoutParams.bottomMargin = (int)getContext().getResources().getDimension(margin); 
     mRootView.setLayoutParams(layoutParams); 
    } 
} 

Và cho đầy đủ các ví dụ này, kích thước

<resources>  
    <dimen name="spot_list_footer_position_offset">-56dp</dimen> 
</resources> 

Tôi hy vọng điều này là những gì bạn đang tìm kiếm.

0

Câu trả lời này sẽ là một nâng cao để @Phin câu trả lời

@Override 
public void onBindViewHolder(final ItemViewHolder holder, int position) { 

    .... 
    Your other code 
    .... 
    // Check if it is the last item and the list is not empty. 
      if(i == arraylist.size()-1) { 
       // If so, add some margin to the element 
       itemHolder.setBottomMargin(R.dimen.quick_controls_height); // some dimension (or set a fixed amount of pixels 
      } else { 
       itemHolder.setBottomMargin(R.dimen.zero_margin); //Set zero margin as the views will be reused. 
      } 

} 

dimens.xml:

<dimen name="quick_controls_height">34.1dp</dimen> 
<dimen name="zero_margin">0dp</dimen> 
1

Bạn có thể tạo ItemDecoration của riêng bạn và thiết lập có một bù đắp cho mục đầu tiên và cũng có lợi nhuận giữa các mục.

Đây là mã của tôi cho recyclerview cuộn ngang của tôi.

public class HorizontalContentItemDecoration extends RecyclerView.ItemDecoration { 
    private int startOffset = 10; 
    private int itemOffset = 10; 

    public HorizontalContentItemDecoration(int startOffset, int itemOffset) { 
    this.startOffset = startOffset; 
    this.itemOffset = itemOffset; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, 
          RecyclerView.State state) { 

    int position = parent.getChildAdapterPosition(view); 

    if (position == 0) { 
     outRect.set(startOffset, 0, itemOffset, 0); 
    } else { 
     outRect.set(0, 0, itemOffset, 0); 
    } 
    } 
} 
Các vấn đề liên quan