动态改变recyclerview的item的布局

大家都知道listview可以使用动态改变item布局。

@Override

public int getItemViewType(int position){

    return type;

}

@Override

public int getViewTypeCount() {

    return number;

}

当然recyclerview同样可以动态改变item布局

1、继承 RecyclerView.Adapter<RecyclerView.ViewHolder>

public class CommentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>

2、重写 getItemViewType(int position)

/**
* 决定元素的布局使用哪种类型 

* @param position 数据源的下标 
* @return 一个int型标志,传递给onCreateViewHolder的第二个参数 
*/


@Override

public int getItemViewType(int position) {

    return mDatas.get(position).getType();

}

3、在 onCreateViewHolder(ViewGroup parent, int viewType) 判断使用哪一种布局

/** 

* 渲染具体的ViewHolder 
*
* @param parent   ViewHolder的容器 
* @param viewType 一个标志,我们根据该标志可以实现渲染不同类型的ViewHolder 
* @return 
*/

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    Log.e("terry", "viewType = " + viewType);

    View view = null;

    if (viewType == COMMENT_FIRST) {

        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.comment_main_first, parent, false);        

        return new CommentFirstHolder(view);

    } else if (viewType == COMMENT_SECOND) {

        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.comment_main_second, parent, false);

        return new CommentSecondHolder(view);

  }

  return null;

}

4、最后在onBindViewHolder(RecyclerView.ViewHolder holder, int position)绑定数据

@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    

    if (holder instanceof CommentFirstHolder) {       

        ......

    } else if (holder instanceof CommentSecondHolder) {

        ......

    }
}

5、定义对应的ViewHolder类

//第一个ViewHolder

public class CommentFirstHolder extends RecyclerView.ViewHolder {

    public CommentFirstHolder(View itemView) {

        super(itemView);

    }

}

//第二个ViewHolder

public class CommentSecondHolder {

    public CommentSecondHolder(View itemView) {

        super(itemView);

    }
}

我的具体代码例子如下:


/**
 * Created by xiaobo 2016/6/24
 */
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {

    // 数据集
    private String[] mDataset;
    private OnRecyclerViewItemClickListener mOnItemClickListener = null;
    private int COMMENT_FIRST = 1;
    private int COMMENT_SECOND = 2;

    public MyAdapter(String[] dataset) {
        super();
        mDataset = dataset;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        // 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView
      if (viewType == COMMENT_FIRST) {
         View viewOne = View.inflate(viewGroup.getContext(), R.layout.item_listview, null);
         viewOne.setOnClickListener(this);
         return new FristViewHolder(viewOne);
      } else if (viewType == COMMENT_SECOND) {
         View viewTwo = View.inflate(viewGroup.getContext(), R.layout.item_listview_two, null);
         viewTwo.setOnClickListener(this);
         return new SecondViewHolder(viewTwo);
      }
        return null;
    }

    //将数据与界面进行绑定的操作
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {

        if (viewHolder instanceof FristViewHolder) {
            // 绑定数据到ViewHolder上
            FristViewHolder holderFrist = (FristViewHolder) viewHolder;
            holderFrist.mTvItem.setText(mDataset[position]);
            //将数据保存在itemView的Tag中,以便点击时进行获取
            viewHolder.itemView.setTag(mDataset[position]);

        } else if (viewHolder instanceof SecondViewHolder) {
            SecondViewHolder holderSecond = (SecondViewHolder) viewHolder;
            holderSecond.mTvItem2.setText(mDataset[position]);
        }

    }

    /**
     * 根据position的不同选择不同的布局类型
     * COMMENT_FIRST = 1; 类型1
     * COMMENT_SECOND = 2; 类型2
     */
    @Override
    public int getItemViewType(int position) {
        if (position%2==0) {
            return COMMENT_FIRST;
        }else{
            return COMMENT_SECOND;
        }
    }

    //获取数据的数量
    @Override
    public int getItemCount() {
        return mDataset.length;
    }

    @Override
    public void onClick(View v) {

        if (mOnItemClickListener != null) {
            mOnItemClickListener.onItemClick(v, (String) v.getTag());
        }

    }

    //FristViewHolder,持有每个Item的的所有界面元素
    public static class FristViewHolder extends RecyclerView.ViewHolder {

        public TextView mTvItem;
        public TextView mTvText;

        public FristViewHolder(View itemView) {
            super(itemView);
            mTvItem = (TextView) itemView.findViewById(R.id.tv_item);
            mTvText = (TextView) itemView.findViewById(R.id.tv_text);
        }
    }

    //FristViewHolder,持有每个Item的的所有界面元素
    public static class SecondViewHolder extends RecyclerView.ViewHolder {

        public TextView mTvItem2;
        public TextView mTvText2;

        public SecondViewHolder(View itemView) {
            super(itemView);
            mTvItem2 = (TextView) itemView.findViewById(R.id.tv_item_2);
            mTvText2 = (TextView) itemView.findViewById(R.id.tv_text_2);
        }
    }

    public static interface OnRecyclerViewItemClickListener {
        void onItemClick(View view, String mDataset);
    }

    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
        mOnItemClickListener = listener;
    }

}
 

效果图:



具体就是这样了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值