2016-08-15 7 views
2

Возможно ли добавить нижний колонтитул с украшением предметов, а не с помощью адаптера? Поскольку я работаю с очень сложным адаптером с уже множеством различных типов зрителей, я бы хотел добавить одинаковый нижний колонтитул в каждый список в моем приложении.RecyclerView: добавить нижний колонтитул с украшением предметов?

+0

Вы используете адаптер с listView или gridview? –

+0

жаль, что вы не поняли, но, как указано в названии, я использую recyclerview – rqiu

ответ

0

Насколько я могу судить, это самая лучшая практика.

Вот описание из класса RecyclerView.ItemDecoration:

/** 
* An ItemDecoration allows the application to add a special drawing and layout offset 
* to specific item views from the adapter's data set. This can be useful for drawing dividers 
* between items, highlights, visual grouping boundaries and more. 

Однако Вы можете установить определенное поведение при реализации собственного делителя на основе адаптера viewtype делителя должен иметь дело с. Вот пример кода, который я использовал в одном онлайн-курс:

public class Divider extends RecyclerView.ItemDecoration { 

private Drawable mDivider; 
private int mOrientation; 

public Divider(Context context, int orientation) { 
    mDivider = ContextCompat.getDrawable(context, R.drawable.divider); 
    if (orientation != LinearLayoutManager.VERTICAL) { 
     throw new IllegalArgumentException("This Item Decoration can be used only with a RecyclerView that uses a LinearLayoutManager with vertical orientation"); 
    } 
    mOrientation = orientation; 
} 

@Override 
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { 
    if (mOrientation == LinearLayoutManager.VERTICAL) { 
     drawHorizontalDivider(c, parent, state); 
    } 
} 

private void drawHorizontalDivider(Canvas c, RecyclerView parent, RecyclerView.State state) { 
    int left, top, right, bottom; 
    left = parent.getPaddingLeft(); 
    right = parent.getWidth() - parent.getPaddingRight(); 
    int count = parent.getChildCount(); 
    for (int i = 0; i < count; i++) { 
    //here we check the itemViewType we deal with, you can implement your own behaviour for Footer type. 
    // In this example i draw a drawable below every item that IS NOT Footer, as i defined Footer as a button in view 
     if (Adapter.FOOTER != parent.getAdapter().getItemViewType(i)) { 
      View current = parent.getChildAt(i); 
      RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) current.getLayoutParams(); 
      top = current.getTop() - params.topMargin; 
      bottom = top + mDivider.getIntrinsicHeight(); 
      mDivider.setBounds(left, top, right, bottom); 
      mDivider.draw(c); 
     } 
    } 
} 

@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    if (mOrientation == LinearLayoutManager.VERTICAL) { 
     outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); 
    } 
} 

Или вы можете использовать библиотеку под названием Flexible Divider, которая позволяет с помощью настраиваемого вытяжке или ресурс должен быть установлен.

+0

Спасибо за ваш ответ Антон. Вы правы в том, что не являетесь лучшей практикой, поскольку декоратор предметов может иметь разную цель, поэтому, возможно, я могу вернуться к старым и более чистым адаптерам с разными типами представлений. – rqiu

Смежные вопросы