如何添加线性布局始终是 RecyclerView 中的第一个元素?

How to add Linear Layout to be always the first element in RecyclerView?

我有一个带有 CardView 的 RecyclerView,它显示从 database.And 读取的数据,这没有问题。

现在的问题是,我想在同一个 RecyclerView 中添加一个包含 ImageView 和 TextView 的线性布局,并使其始终成为 RecyclerView 中的第一个元素。

这就是我想要的 acheive.The RecyclerView 中的第一个元素始终是线性布局,不管它下面的 CardView 有什么不同。

我从 this link 尝试了这个教程,它似乎处理不同的 ViewType 取决于数据库中的数据,这不是我想要的。

我想要的是

1) 这个线性布局是静态的

2) 始终是 RecyclerView 中的第一个元素。

我检查了 if(index == 0) inonCreateViewHolder` android 工作室无法识别的索引。

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

如果需要linearLayout始终可见,即使recyclerView滚动了,也可以将LinearLayout放在RecyclerView外面。 做类似的事情:

<RelativeLayout
--your attribute-->

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

    <RecyclerView
    --your attributes--/>

</RelativeLayout>

如果线性布局需要成为列表的第一个元素,您可以检查适配器中的位置,如果它是第一个位置(索引 == 0),请使用 LinearLayout 扩充布局,否则使用您已经使用的列表项布局进行扩充。

编辑:

这是一个例子:

只需实施getItemViewType(),并注意onCreateViewHolder()中的viewType参数。

所以你做这样的事情:

@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
    }
}

你应该寻找 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);
         }
    }
}

希望对您有所帮助。

您可以通过创建一个同时包含 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);
}