1

I have a RecyclerView with CardView which display the data read from the database.And this have no problem with it.

Now the problem is,I want to add a Linear layout which content both ImageView and TextView inside in the same RecyclerView,and make it always the First Element in the RecyclerView.

This is what I want to acheive.The first element in the RecyclerView is always the Linear Layout,no matter what different in the CardView below it.

what i want to acheive

I try this tutorial from this link it seems like handle the different ViewType depends of the data from the database,which is not what I want.

What I want is

1) This Linear Layout is static

2) Always the First element in the RecyclerView.

I check if(index == 0) inonCreateViewHolder`the index just not recognised by the 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);
        }
    }
4

3 回答 3

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.makeFirstmake LinearLayoutvisible 和 remove 中CardView

public void makeFirst() {
    linearlayout.setVisibility(VISIBLE);
    cardView.setVisibility(GONE);
}
于 2017-03-05T12:27:36.383 回答
2

如果需要linearLayout始终可见,即使recyclerView滚动,也可以将LinearLayout放到RecyclerView之外。执行以下操作:

<RelativeLayout
--your attribute-->

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

    <RecyclerView
    --your attributes--/>

</RelativeLayout>

如果线性布局需要成为列表的第一个元素,您可以检查适配器中的位置,如果它是第一个位置(索引 == 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
    }
}
于 2017-03-05T11:37:36.757 回答
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);
         }
    }
}

希望这可以帮助。

于 2017-03-05T12:21:36.373 回答