1

私は、データベースから読み取ったデータを表示するCardViewでRecyclerViewを持っています。これは問題ありません。RecyclerViewの最初の要素になるように線形レイアウトを追加する方法は?

問題は、ImageViewとTextViewの両方を同じRecyclerViewに格納し、常にRecyclerViewの最初の要素にするリニアレイアウトを追加することです。

これは私が習得したいことです。RecyclerViewの最初の要素は、その下にあるCardViewの違いにかかわらず、常に線形レイアウトです。

what i want to acheive

私は別のViewType列挙は、私が欲しいものではありませんデータベースからのデータの依存扱うようにそれはそうthis linkからこのチュートリアルを試してみてください。私が欲しいもの

は、このリニアレイアウトはRecyclerViewで常に最初の要素)

2静的である)

1です。

私はif(index == 0) in onCreateViewHolder`をチェックしていますが、アンドロイドスタジオでは認識されていません。

@Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if(index== 0) { 
      View feedInput = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_input, parent, false); 
      return new MyViewHolder(feedInput); 
     }else { 
      View feedItemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_item, parent, false); 
      return new MyViewHolder(feedItemView); 
     } 
    } 
+2

なぜ、LinearLayoutをRecyclerViewに入れる必要がありますか?あなたはそれを一番上に置くことができますか? –

+1

@MichaelVescovoリサイクルビュー内でリサイクルビューが必要なので、リサイクルビューをスクロールするとスクロールできます – ken

答えて

3

LinearLayoutCardViewの両方を含むレイアウトを作成して、それをboth_layoutと呼ぶことができます。 LinearLayoutの可視性を維持するGONE。あなたのViewHolder.makeFirst

@Override 
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = (View) LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.both_layout, parent, false); 
    // Inflate both the layout. 
    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    if (position == 0) { 
     holder.makeFirst(); 
    } 
} 

LinearLayoutが見えるとCardViewを削除します。

public void makeFirst() { 
    linearlayout.setVisibility(VISIBLE); 
    cardView.setVisibility(GONE); 
} 
+0

この作品は魅力的です – ken

+0

あなたは間違いなく私の日を節約しました..お気持ち – ken

+0

あなたは大歓迎です。 –

2

あなたはのLinearLayoutがrecyclerViewがスクロールされた場合でも、常に見えるようにする必要がある場合は、あなたがRecyclerView外のLinearLayoutを置くことができます。 ような何か:のLinearLayoutは、それが第一の位置(インデックス== 0)だ場合、あなたとのレイアウトを膨らませる、あなたはアダプタでの位置を確認することができ、あなたのリストの最初の要素にする必要がある場合は

<RelativeLayout 
--your attribute--> 

    <LinearLayout 
    --your attributes--> 
     //Your LinearLayout elements here 
    </LinearLayout> 

    <RecyclerView 
    --your attributes--/> 

</RelativeLayout> 

LinearLayout、そうでない場合は、あなたが使用しているリスト項目のレイアウトを展開します。

EDIT:

はここに例を示します

だけgetItemViewType()を実装し、onCreateViewHolder()viewTypeパラメータの世話をします。

だからあなたのようなものです:

@Override 
public int getItemViewType(int position) { 
    if (position == 0) 
     return 1; 
    else 
     return 2; 
} 

はその後onCreateViewHolderであなたのviewTypeに応じて、あなたの異なるレイアウトを膨らませます。

あなたが viewType、無 index探さなければならない
@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == 1) { 
     // inflate your first item layout & return that viewHolder 
    } else { 
     // inflate your second item layout & return that viewHolder 
    } 
} 
+0

は 'if(index == 0)'がリニアレイアウトを膨張させ、そうでなければカードビューを膨張させます。 ?? – ken

+0

はい、まさに:) –

+0

おかげで、私に試してみましょう.. – ken

0

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

    class LinearViewHolder extends RecyclerView.ViewHolder { 

     public LinearViewHolder(View itemView){ 
     View feedInput = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_input, parent, false); 
      return new LinearViewHolder(feedInput); 
     } 
    } 

    class ItemViewHolder extends RecyclerView.ViewHolder { 

     public ItemViewHolder(View itemView){ 
     View feedItemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_item, parent, false); 
      return new ItemViewHolder(feedItemView); 
    } 

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

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if(viewType == 0) { 
      return new LinearViewHolder(); 
     } else { 
       return new ItemViewHolder(); 
     } 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 
     if(holder.getItemViewType() == 0) { 
      LinearViewHolder linearHolder = LinearViewHolder(holder); 
     } else { 
       ItemViewHolder itemHolder = ItemViewHolder(holder); 
     } 
    } 
} 

は、この情報がお役に立てば幸いです。

関連する問題