RecyclerView的不同position加载不同View实现

在android开发中,有很多页面,可能一个页面上面需要2种不同的recyclerView,一般的,我们会使用一个scrollview,然后嵌套2个recyclerView,但是嵌套总会有点问题,除非你重写方法,listView是重写listview的onMeasure方法,RecyclerView重写LayoutManager方法,具体可以参考之前的一篇博客
http://blog.csdn.net/picasso_l/article/details/50324863

但是,这么做可能还是会有这样那样的限制。

下面介绍一种新的方法,全部用一个RecyclerView或者listview显示,用getItemViewType方法中不同的position,设置不同的ViewType

核心思想:
1.重写RecyclerView.Adapter的getItemViewType(int position),在此方法中根据不同的position,设置不同的ViewType
2.编写具体的RecyclerView.ViewHolder子类(不同子类对应不同View或Layout)
3.重写RecyclerView.Adapter的onCreateViewHolder(ViewGroup parent,int viewType) 在此方法中根据我们之前设置的ViewType来返回不同的RecyclerView.ViewHolder的子类

直接上代码

public class FunItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<FunItemModel.ImageUrlEntity> mImgList;
    private List<CommentsEntity> mCommentList;
    private Context mContext;
    private String author, time, msg, authorUrl, location;
    private static final int TYPE_INFO = 0;
    private static final int TYPE_IMGS = 1;
    private static final int TYPE_MSG = 2;
    private static final int TYPE_CT = 3;
    private static final int TYPE_COMS = 4;


    public FunItemAdapter(List<FunItemModel.ImageUrlEntity> imageUrlList, List<CommentsEntity> commentsList, String author, String authorUrl, String time, String location, String msg, Activity context) {
        LogCat.i("FunItemAdapter");
        mImgList = imageUrlList;
        mCommentList = commentsList;
        this.author = author;
        this.time = time;
        this.msg = msg;
        this.authorUrl = authorUrl;
        this.location = location;
        mContext = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

        RecyclerView.ViewHolder holder = getViewHolderByViewType(viewType);

        return holder;

    }

    private RecyclerView.ViewHolder getViewHolderByViewType(int viewType) {

        View view_info = View.inflate(mContext, R.layout.fun_item_info, null);
        View view_imgs = View.inflate(mContext, R.layout.fun_detail_pic_item_view, null);
        RecyclerView.ViewHolder holder = null;
        switch (viewType) {
            case TYPE_INFO:
                holder = new ViewHolder_Info(view_info);
                break;
            case TYPE_IMGS:
                holder = new ViewHolder_Imgs(view_imgs);
                break;
        }
// if(i==(mImgList.size()+1)){//msg
//
// }
//
// if(i>(mImgList.size()+1)){//pinglun
//
// }
        return holder;
    }

    @Override
    public int getItemViewType(int position) {

        if (position == 0) {
            return TYPE_INFO;
        }
        if (position > 0 && position <= mImgList.size()) {//mImgList){
            return TYPE_IMGS;
        }
        return 0;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
        if (i == 0) {
            Picasso
                    .with(mContext)
                    .load(authorUrl)
                    .into(((ViewHolder_Info)viewHolder).detail_author_img);
            ((ViewHolder_Info)viewHolder).detail_author_text.setText(author);
            ((ViewHolder_Info)viewHolder).detail_location.setText(location);
            ((ViewHolder_Info)viewHolder).detail_time.setText(time);
// mMsgText.setText(msg);

        }
        if (i > 0) {
            String url = mImgList.get(i - 1).getValue();
            LogCat.i("帖子详情图片地址url=" + url);

            Transformation transformation = new PicassoTransformation(((ViewHolder_Imgs)viewHolder).detail_pic_item);

            if (url != null && !url.equals("")) {
                url = Constant.QINIU_YUN + url;
                Picasso
                        .with(mContext)
                        .load(url)
                        .placeholder(R.mipmap.zhanwei)
                        .error(R.mipmap.zhanwei)
                        .transform(transformation)
                        .into(((ViewHolder_Imgs)viewHolder).detail_pic_item);
            }
        }

    }


    @Override
    public int getItemCount() {
        return 1 + mImgList.size()/*+1+1+mCommentList.size()*/;
    }

    class ViewHolder_Info extends RecyclerView.ViewHolder {
        public ImageView detail_author_img;
        public TextView detail_author_text,detail_time,detail_location;

        public ViewHolder_Info(View itemView) {
            super(itemView);
            detail_author_img = (ImageView)itemView.findViewById(R.id.detail_author_img);
            detail_author_text = (TextView)itemView.findViewById(R.id.detail_author_text);
            detail_time = (TextView)itemView.findViewById(R.id.detail_time);
            detail_location = (TextView)itemView.findViewById(R.id.detail_location);
        }
    }

    class ViewHolder_Imgs extends RecyclerView.ViewHolder {
        public ImageView detail_pic_item;

        public ViewHolder_Imgs(View itemView) {
            super(itemView);
            detail_pic_item = (ImageView)itemView.findViewById(R.id.detail_pic_item);
        }
    }
}

效果可以是这样的
RecyclerView的不同position加载不同View实现_第1张图片
RecyclerView的不同position加载不同View实现_第2张图片

如上面2张图,从用户信息,到图片列表,到评论列表都是可以写在一个RecyclerView里面的

你可能感兴趣的:(android,不同position,不同view)