2016-04-13 3 views
0

У меня есть список элементов, количество элементов составляет 5:Избыточные элементы в RecyclerView с колонтитулов

List<ReviewResource> reviewsList = new ArrayList<ReviewResource>(); 
    ReviewResource r1 = new ReviewResource(); 
    r1.setText("1"); 
    reviewsList.add(r1); 

    ReviewResource r2 = new ReviewResource(); 
    r2.setText("2"); 
    reviewsList.add(r2); 

    ReviewResource r3 = new ReviewResource(); 
    r3.setText("3"); 
    reviewsList.add(r3); 

    ReviewResource r4 = new ReviewResource(); 
    r4.setText("4"); 
    reviewsList.add(r4); 

    ReviewResource r5 = new ReviewResource(); 
    r5.setText("5"); 
    reviewsList.add(r5); 

Существует мой RecyclerView адаптер:

public class ReviewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private static final int TYPE_HEADER = 0; 
    private static final int TYPE_ITEM = 1; 
    private static final int TYPE_FOOTER = 2; 

    List<ReviewResource> listItems; 

    public ReviewAdapter(List<ReviewResource> list) { 
     listItems = list; 
    } 


    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if (viewType == TYPE_HEADER) { 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.reviews_header_item, parent, false); 
      return new VHHeader(v); 
     } else if (viewType == TYPE_ITEM) { 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.reviews_list_item, parent, false); 
      return new VHItem(v); 
     } else if (viewType == TYPE_FOOTER) { 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.reviews_footer_item, parent, false); 
      return new VHFooter(v); 
     } 
     throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly"); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if (holder instanceof VHHeader) { 
      VHHeader header = (VHHeader) holder; 
     } else if (holder instanceof VHItem) { 
      VHItem item = (VHItem) holder; 
      if (position + 1 < listItems.size()) { 
       ReviewResource currentReview = listItems.get(position+1); 
       item.reviewDescription.setText(currentReview.getText()); 
      } 
     } else if (holder instanceof VHFooter) { 
      VHFooter footer = (VHFooter) holder; 
     } 
    } 

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

    public ReviewResource getItem(int position) { 
     return listItems.get(position); 
    } 

    class VHHeader extends RecyclerView.ViewHolder { 
     TextView txtTitle; 

     public VHHeader(View itemView) { 
      super(itemView); 
     } 
    } 

    class VHItem extends RecyclerView.ViewHolder { 
     TextView reviewDescription; 
     TextView reviewTitle; 

     public VHItem(View itemView) { 
      super(itemView); 
      reviewDescription = (TextView) itemView.findViewById(R.id.reviewer_text); 
      reviewTitle = (TextView) itemView.findViewById(R.id.review_title); 
     } 
    } 

    class VHFooter extends RecyclerView.ViewHolder { 
     TextView mWriteAReviewFooter; 
     TextView mViewAllFooter; 

     public VHFooter(View itemView) { 
      super(itemView); 
      this.mWriteAReviewFooter = (TextView) itemView.findViewById(R.id.write_a_review_footer); 
      this.mViewAllFooter = (TextView) itemView.findViewById(R.id.view_all_footer); 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (position == 0) { 
      return TYPE_HEADER; 
     } else if (position == getItemCount() - 1) { 
      return TYPE_FOOTER; 
     } else { 
      return TYPE_ITEM; 
     } 
    } 
} 

Ожидаемый результат

Header

нижнего колонтитула

Фактический результат

Заголовок

пустой элемент

нижнего колонтитула

только те пункты 3,4 и 5 показаны в моем RecyclerView с пустой строки после 5-го пункта.

Почему?

В любом случае, спасибо!

+0

Вы уверены, что ваш заголовок не скрывает пункт 1 и 2 под ним?возможно, добавить к нему маржу? – Robbert

+0

Yeap, я уверен, что заголовок не переполняет элементы. Строка заголовка в 5 раз меньше, чем строка элементов, и я играю с полями, я думаю, что проблема в адаптере. – VLeonovs

+0

проверить мой ответ –

ответ

1

Ваш getItemCount должен быть

@Override 
public int getItemCount() { 
    return listItems.size() + 2;//HEADER + FOOTER 
} 

добавить метод

public int getDataCount() { 
    return listItems.size(); 
} 

и в onBindViewHolder

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (holder instanceof VHHeader) { 
     VHHeader header = (VHHeader) holder; 
    } else if (holder instanceof VHItem) { 
     VHItem item = (VHItem) holder; 
     int index = position - 1;// -1 to consider HEADER 
     if (index < getDataCount()) { 
      ReviewResource currentReview = listItems.get(index); 
      item.reviewDescription.setText(currentReview.getText()); 
     } 
    } else if (holder instanceof VHFooter) { 
     VHFooter footer = (VHFooter) holder; 
    } 
} 

надеюсь это будет работать

1

Сначала вы возвращаете неправильный размер элемента в getItemCount() должно быть

@Override 
    public int getItemCount() { 
     return listItems.size() + 2; 
    } 

+2 вместо +1

и изменения:

if (position + 1 < listItems.size()) { 
       ReviewResource currentReview = listItems.get(position+1); 
       item.reviewDescription.setText(currentReview.getText()); 
      } 

к:

ReviewResource currentReview = listItems.get(position-1); 
        item.reviewDescription.setText(currentReview.getText()); 
Смежные вопросы