2015-06-15 5 views
1

Я использую RecyclerView для отображения текста в CardView, но я хочу, чтобы добавить заголовок TextView в верхней части RecyclerView которая выглядит следующим образом:RecyclerView с несколькими макетами

enter image description here

Так я сделал еще один файл макета «top_header.xml» с помощью только TextView, но я не уверен, как изменить адаптер, чтобы получить оба макета там.

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

List<AdapterData> mItems; 

public Adapter() { 
    super(); 
    mItems = new ArrayList<AdapterData>(); 
    AdapterData data = new AdapterData(); 
    data.setCode("dummytext"); 
    data.setResult("dummytext"); 
    mItems.add(data); 

    data = new AdapterData(); 
    data.setCode("dummytext"); 
    data.setResult("dummytext"); 
    mItems.add(data); 

    data = new AdapterData(); 
    data.setCode("dummytext"); 
    data.setResult("dummytext"); 
    mItems.add(data); 

    data = new AdapterData(); 
    data.setCode("dummytext"); 
    data.setResult("dummytext"); 
    mItems.add(data); 

    data = new AdapterData(); 
    data.setCode("dummytext"); 
    data.setResult("dummytext"); 
    mItems.add(data); 

} 

@Override 
public int getItemViewType(int position) { 
    int viewType = 0; 
    return viewType; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == 0) { 
     return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.top_textview, parent, false)); 
    } 

    return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_card_item, parent, false)); 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 
    AdapterData data = mItems.get(position); 
    viewHolder.code.setText(data.getCode()); 
    viewHolder.result.setText(data.getResult()); 

} 


@Override 
public int getItemCount() { 
    return mItems.size(); 
} 


class ViewHolder1 extends RecyclerView.ViewHolder{ 
    public TextView header; 

    public ViewHolder1(View itemView) { 
     super(itemView); 
     header = (TextView)itemView.findViewById(R.id.header_textview); 

    } 
} 

class ViewHolder2 extends RecyclerView.ViewHolder{ 
    public TextView code; 
    public TextView result; 

    public ViewHolder2(View itemView) { 
     super(itemView); 
     code = (TextView)itemView.findViewById(R.id.sims_code); 
     result = (TextView)itemView.findViewById(R.id.sims_result); 

    } 
} 


} 
+0

ok Я добрался до этого момента, и я думаю, что это правильно, но не уверен, что должно быть с текущим кодом onBindViewHolder, я должен создать новый код BindHolder * –

ответ

0

Если вы хотите добавить несколько типов представлений (более 2-х типов), а не просто header и «нормальный» item, CommonsWare answer совершенен. Но если вам достаточно двух указанных типов (header и item), ответ может быть намного проще (с практической точки зрения).

Есть две относительно простые библиотеки, которые можно использовать для этого:

  1. RecyclerViewHeader - супер простой в использовании, но использует немного «Hacky» подход, который иногда может вызвать проблемы. Подходит для относительно простых заголовков.

  2. HeaderRecyclerView - Подходит для любых типоразмеров. Реализует подход, упомянутый CommonsWare, для раздувания двух видов видов. Немного сложнее в использовании, чем RecyclerViewHeader, но ничего сложного в использовании на ежедневной основе.

Для раскрытия: Я автор RecyclerViewHeader. Я осознаю свои недостатки, поэтому я не пытаюсь продвигать его как одноразовое решение, а скорее как интересную альтернативу усложнению вашего адаптера. HeaderRecyclerView - это хороший фрагмент кода, который упрощает вашу работу. Я использую его сам, когда заголовок RecyclerView усложняется.

2

Вам нужно сделать три изменения:

  1. Реализовать getItemViewType() на вашем RecyclerView.Adapter, чтобы вернуть уникальное число для каждого типа представления, необходимые вашим приложением, на основе прилагаемого position. Итак, вы вернете одно значение для своего заголовка (предположительно position из 0) и другое значение для всего остального.

  2. Обратите внимание на параметр viewType, переданный в onCreateViewHolder(), и при необходимости создайте соответствующий RecyclerView.ViewHolder. Это, в свою очередь, вероятно, означает, что у вас должны быть разные классы ViewHolder для заголовков и строк.

  3. onBindViewHolder() В, применяется связывающая логика, основанная на типе ViewHolder, что вы получите, так что вы связать соответствующие данные в ViewHolder. Вы можете использовать instanceof или классы ViewHolder реализуют общий интерфейс или что-то еще, чтобы сделать эту работу.

This sample app демонстрирует RecyclerView с заголовками секций, которые реализуют указанные выше шаги.

0

должны создать другой тип View держателя, а также имеют привязки данных в соответствии с видом держателя вид. Этот вопрос уже спросил и ответить Recyclerview and handling different type of row inflation здесь, и это поможет вам

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