2015-06-15 86 views
1

我使用RecyclerView顯示在CardView文字,但我想在那個看起來像這樣的RecyclerView的頂部添加頁眉的TextView: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和「正常」 itemCommonsWare answer是完美的。但是,如果提到的兩種類型(headeritem)對您來說足夠了,答案可能會更簡單(從實際的角度來看)。

有兩個比較簡單的庫,您可以使用爲:

  1. RecyclerViewHeader - 使用超級簡單,但使用的是有點「哈克」的方式,有時可能會出現問題。適用於相對簡單的標題。

  2. HeaderRecyclerView - 適用於任何類型的報頭的。實現CommonsWare提到的方法來誇大兩種類型的視圖。比RecyclerViewHeader更難使用,但每天都不易使用。

對於披露:我是RecyclerViewHeader的作者。我意識到它的缺陷,因此我並不是試圖將其作爲一對多的解決方案進行推廣,而更多地是將適配器複雜化的有趣替代方案。 HeaderRecyclerView是一段不錯的代碼,可以簡化您的工作。當我的RecyclerView頭部變得複雜時,我自己使用它。

2

您需要實現三個轉變:

  1. RecyclerView.Adapter實施getItemViewType(),換來您的應用所需的每個視圖類型的基礎上,提供position一個唯一的整數。所以,您會爲您的標題返回一個值(可能是0position),而其他值則爲其他值。

  2. 注意傳入onCreateViewHolder()viewType參數,並根據需要創建合適的RecyclerView.ViewHolder。這反過來可能意味着您應該爲頭和行的行有不同的ViewHolder類。

  3. onBindViewHolder()中,根據您獲得的ViewHolder的類型應用綁定邏輯,以便將相應的數據綁定到ViewHolder。你可以使用instanceof,或者讓ViewHolder類實現一個通用接口,或者使其工作。

This sample app演示RecyclerView帶有實現上述步驟的節頭。

相關問題