2015-03-20 17 views

cevap

6

Çözüm basit: Başka öneri olmadığı gibi

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

Bu. En basit çözüm. –

0

Bunu, açık bir arka plan rengiyle görünümün sonunda bir kayma ekleyen özel bir RecyclerView Hücresi ekleyerek çözdüm.

+0

O inşaat ... ama yanlış görünüyor ... Ben aynı görme için gittin. Yine de daha iyi bir çözüm olmalı! – CMash

1

Kodu güzel bir şekilde izole eden, bunu elde etmek için bir sarmalayıcı bağdaştırıcısı oluşturdum. Ama, bunu Sonra ..

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

daha iyi bir çözüm gibi kullanırsınız: Bu soru en fazla bir yaşında olan

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

rağmen, ben ne yaptım paylaşmak istedim, birileri olabilir beğenmek, ya da sadece yazmak istemiyor ve kopyalamak/yapıştırmak: D.

Çözümüm son öğeye bir alt kenar boşluğu eklemek oldu.

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

Sonra alt kenar boşluğunu ayarlamak için viewholder bir yöntemi vardır:

Öncelikle bunun son öğe olduğunu belirler.

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

Ve bu örnekte tamlığı

, boyut

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

Bunun Aradığın ne umut.

0

Bu cevap

@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 @Phin cevap bir geliştirme olacaktır:

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

Kendi ItemDecoration oluşturabilir ve set orada bir ofset ilk öğe için ve Ayrıca öğeler arasında marjlar.

Yatay kaydırma geridönüşüm görünümüm için kodum İşte.

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); 
    } 
    } 
} 
İlgili konular