2015-03-20 16 views
7

मैं RecyclerView को आईओएस में UICollectionView जैसे कार्यान्वित करने की कोशिश कर रहा हूं। मैं रीसाइक्लिंग दृश्य के नीचे contentInset सेट करना चाहता हूं लेकिन मुझे ऐसा करने का विकल्प नहीं मिल रहा है।सामग्री सेट करें रीसाइक्लर में देखें

क्या एंड्रॉइड के लिए कुछ समान है?

उत्तर

6

समाधान सरल है:

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

यह। दूर तक सरल समाधान। –

0

मैंने इसे एक कस्टम रीसाइक्लिंग व्यू सेल जोड़ने का हल किया है जो स्पष्ट पृष्ठभूमि रंग के साथ दृश्य के अंत में ऑफसेट जोड़ता है।

+0

यह काम करता है ... लेकिन यह गलत लगता है ... मैं एक ही देखने के लिए वहाँ के रूप में किसी भी अन्य सुझाव उपलब्ध नहीं है चले गए हैं। यद्यपि एक बेहतर समाधान होना चाहिए! – CMash

1

मैंने इसे प्राप्त करने के लिए एक रैपर एडाप्टर बनाया है, जो कोड को अच्छी तरह से अलग करता है। लेकिन, मुझे एक बेहतर समाधान तो चाहते हैं ..

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); 
     } 
    } 
} 

का उपयोग यह:

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

हालांकि इस सवाल का एक वर्ष से अधिक पुराना है, मैंने सोचा कि मैं हिस्सा था मैं क्या किया, किसी को हो सकता है इस तरह, या सिर्फ टाइप नहीं करना चाहते हैं और इस प्रकार कॉपी/पेस्ट कर सकते हैं: डी।

मेरा समाधान अंतिम आइटम में कुछ नीचे मार्जिन जोड़ना था।

सबसे पहले मैं यह निर्धारित यह पिछले आइटम है:

@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 
    } 
} 

तब मैं viewholder में एक विधि निचला हाशिया सेट करना होगा।

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); 
    } 
} 

और इस उदाहरण की पूर्णता के लिए, आयाम

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

मुझे आशा है कि यह आपके लिए क्या देख रहे थे है।

0

इस उत्तर @Phin जवाब देने के लिए बढ़ा हुआ

@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

आप अपनी खुद की ItemDecoration बना सकते हैं और कर सकते हैं सेट वहाँ एक पहला आइटम के लिए ऑफसेट और वस्तुओं के बीच मार्जिन भी।

मेरे क्षैतिज स्क्रॉलिंग पुनर्चक्रण के लिए मेरा कोड यहां है।

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); 
    } 
    } 
} 
संबंधित मुद्दे