RecyclerView的Item多种类型的选择之普通方法实现

来源:互联网 发布:淘宝宝贝自检工具 编辑:程序博客网 时间:2024/05/23 01:59

首先上效果图:二种不同的管理器

这里写图片描述


这里写图片描述

以上的状态示意图:我们可以将头部和身体部分以及尾部部分看成三种不同的Type类型

代码如下:注释很清晰
第一步:窗口代码

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        RecyclerView   mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);        //设置listView管理器        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);        //设置垂直方向        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);        mRecyclerView.setLayoutManager(linearLayoutManager);        //Grid表格布局        /*GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);        mRecyclerView.setLayoutManager(gridLayoutManager);*/        // 同时在adapter中必须去实现onAttachedToRecyclerView        //设置其Adapter        ProductAdapter productAdapter = new ProductAdapter(this);        mRecyclerView.setAdapter(productAdapter);    }

第二步:适配器中代码如下:

public class ProductAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    private Context mContext;    public ProductAdapter(Context context) {        this.mContext = context;    }    //设置三种不同Item类型,分别是头部,item,尾部    public static final int ITME_TYPE_HEADER = 1;    public static final int ITME_TYPE_CONTENT = 2;    public static final int ITME_TYPE_BOTTOM = 3;    //模拟填充假数据    public String[] texts = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "P"};    //设置默认头部和底部数据只有一个    private int mHeadCount = 1;    private int mButtomCount = 1;    //获得内容的长度    public int getContentItemCount() {        return texts.length;    }    //根据不同类型的viewType,创建不同的ViewHolder    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        switch (viewType) {            case ITME_TYPE_HEADER:                View view = LayoutInflater.from(mContext).inflate(R.layout.head_recycler_adapter, parent, false);                return new HeadViewHolder(view);            case ITME_TYPE_CONTENT:                View view2 = LayoutInflater.from(mContext).inflate(R.layout.content_recycler_adapter, parent, false);                return new ContentViewHolder(view2);            case ITME_TYPE_BOTTOM:                View view1 = LayoutInflater.from(mContext).inflate(R.layout.buttom_recycler_adapter, parent, false);                return new ButtomViewHolder(view1);        }        return null;    }    //头部ViewHolder    public static class HeadViewHolder extends RecyclerView.ViewHolder {        HeadViewHolder(View itemView) {            super(itemView);        }    }    //尾部ViewHodler    public static class ButtomViewHolder extends RecyclerView.ViewHolder {        ButtomViewHolder(View itemView) {            super(itemView);        }    }    //内容ViewHodler    public static class ContentViewHolder extends RecyclerView.ViewHolder {        private TextView tv_item_text;        ContentViewHolder(View itemView) {            super(itemView);            tv_item_text = (TextView) itemView.findViewById(R.id.tv_item_text);        }    }    //绑定数据    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        //hodler来区别绑定不同的数据        if (holder instanceof HeadViewHolder) {            //具体的控件填充参数处理机其他如点击事件        } else if (holder instanceof ContentViewHolder) {            //索引position必须要减去其头部的个数            ((ContentViewHolder) holder).tv_item_text.setText(texts[position - mHeadCount]);        } else if (holder instanceof ButtomViewHolder) {            //具体的控件填充参数处理机其他如点击事件        }    }    //返回总的视图个数    @Override    public int getItemCount() {        return mHeadCount + mButtomCount +getContentItemCount();    }    //分别返回三种不同类型的TYPE    @Override    public int getItemViewType(int position) {        int dataItemCount = getContentItemCount();        if (mHeadCount != 0 && position < mHeadCount) {            return ITME_TYPE_HEADER;        } else if (mButtomCount != 0 && position >= (dataItemCount + mHeadCount)) {            return ITME_TYPE_BOTTOM;        } else {            return ITME_TYPE_CONTENT;        }    }//当如果是Grid布局的时候需要去实现    @Override    public void onAttachedToRecyclerView(RecyclerView recyclerView) {        super.onAttachedToRecyclerView(recyclerView);        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();        if(layoutManager instanceof GridLayoutManager) {            final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;            gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {                @Override                public int getSpanSize(int position) {                    return  getItemViewType(position) == ITME_TYPE_HEADER || getItemViewType(position) == ITME_TYPE_BOTTOM ? gridLayoutManager.getSpanCount():1;                }            });        }    }}

第三步:简单的贴出使用CardView的代码–即content_recycler_adapter

compile 'com.android.support:recyclerview-v7:25.3.1'compile 'com.android.support:cardview-v7:25.3.1'<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardView    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:card_view="http://schemas.android.com/apk/res-auto"    android:id="@+id/cv_item"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_margin="2dp"    android:foreground="?android:attr/selectableItemBackground"    card_view:cardBackgroundColor="#d7070b"    card_view:cardCornerRadius="4dp"    card_view:cardElevation="4dp">    <TextView        android:layout_gravity="center_horizontal"        android:id="@+id/tv_item_text"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="2dp"        android:text="test"/></android.support.v7.widget.CardView>

以上:即可实现

阅读全文
0 0
原创粉丝点击