Android Recyclerview添加其他视图

时间:2018-08-27 18:05:45

标签: java android android-recyclerview

我目前在我的recyclerView中有一个物品清单。但是,我想在随机位置插入其他类型的viewHolder。

我有一个布局文件 my_other_view ,我想将其插入到recyclerview中的任意位置。布局文件也必须与ViewHolder关联。

这是我当前的RecyclerAdapter类

public class MyAdapter extends RecyclerView.Adapter
{
    private List<MyItem> items;
    private Context context;

    public MyAdapter (Context context, List<MyItem> items)
    {
        this.items = items;
        this.context = context;
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
        final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        holder.itemView.setLongClickable(true);
        ((MyViewHolder) holder).bindData(items.get(position));
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    @Override
    public int getItemViewType(final int position) {
        return R.layout.my_list_entry;
    }
}

1 个答案:

答案 0 :(得分:1)

为了保持一致性,请在您的构造函数中创建随机索引,并将其存储在局部变量中。然后做这样的事情

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private static final int TYPE_1 = 1;
    private static final int TYPE_2 = 2;

    int randomPos = 0;

    public MyAdapter (Context context, List<MyItem> items){
        this.items = items;
        this.context = context;
        randomPos = new Random().nextInt(items.size());
    }
    @Override
    public int getItemViewType(int position) {
        return position == randomPos ? TYPE_2 : TYPE_1;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         switch (viewType) {
             case TYPE_1: return new ViewHolder1(...);
             case TYPE_2: return new ViewHolder2(...);
         }
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        switch (holder.getItemViewType()) {
            case TYPE_1:
                ViewHolder1 viewHolder1 = (ViewHolder1)holder;
                ...
                break;
            case TYPE_2:
                ViewHolder2 viewHolder2 = (ViewHolder2)holder;
                ...
                break;
        }
    }

    class ViewHolder1 extends RecyclerView.ViewHolder {
        ...
        public ViewHolder1(View itemView){
        ...
        }
    }

    class ViewHolder2 extends RecyclerView.ViewHolder {
        ...
        public ViewHolder2(View itemView){
        ...
    }
}