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

时间:2017-03-05 11:02:27

标签: android android-layout android-recyclerview recyclerview-layout

我有一个带有CardView的RecyclerView,它显示从数据库中读取的数据。这对它没有任何问题。

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

这就是我想要实现的目标.RecyclerView中的第一个元素始终是线性布局,无论它下面的CardView有什么不同。

what i want to acheive

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

我想要的是

1)此线性布局是静态的

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

我检查if(index == 0) in onCreateViewHolder`索引,但是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);
        }
    }

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

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

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

答案 2 :(得分: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);
         }
    }
}

希望这有帮助。