1

我有一個帶CardView的RecyclerView,它顯示從數據庫中讀取的數據。並且這沒有問題。如何添加線性佈局始終是RecyclerView中的第一個元素?

現在的問題是,我想添加一個線性佈局,其內容ImageView和TextView裏面在同一個RecyclerView中,並使其始終是RecyclerView中的第一個元素。

這就是我想要的.RecyclerView中的第一個元素始終是線性佈局,無論CardView下面有什麼不同。

what i want to acheive

我試試這個教程從this link好像處理不同ViewType取決於從數據庫中,這是不是我想要的數據。

我要的是

1)這種線性佈局是靜態的

2)總是在RecyclerView第一要素。

我檢查if(index == 0) in onCreateViewHolder索引剛剛沒有被android studio識別。

@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的可見性。

@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(); 
    } 
} 

在你ViewHolder.makeFirst使LinearLayout可見光和刪除CardView

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

這項工作很有魅力 – ken

+0

你一定會拯救我的一天..謝謝 – ken

+0

不客氣。 –

2

如果需要的LinearLayout是始終可見,即使recyclerView滾動,你可以把RecyclerView外面的LinearLayout。 這樣做:

<RelativeLayout 
--your attribute--> 

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

    <RecyclerView 
    --your attributes--/> 

</RelativeLayout> 

如果LinearLayout中需要是你可以檢查適配器的位置列表的第一個元素,如果它的第一位置(指數== 0),與誇大的佈局你的LinearLayout,否則用你使用的列表項目佈局膨脹。

編輯:

下面是一個例子:

只實現getItemViewType(),並照顧viewType參數的onCreateViewHolder()

所以,你做這樣的事情:

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

然後onCreateViewHolder根據您viewType虛增您不同的佈局。

@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

你應該尋找viewType,沒有index

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); 
     } 
    } 
} 

希望這有助於。

相關問題