RecyclerView-干掉Listview和GridView

RecyclerView隶属于v7包下的一员大将,是谷歌为开发人员准备的一个功能强大的控件,他不仅可以拥有listview和gridview那样集成数据集,还有着设置水平、垂直、正反向显示和实现瀑布流的效果,你只需要了解一下就可以完全替代那两个老家伙了。

先写在你的布局文件中:

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
1.类似listview的展示:


//初始化view
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
//类似listview的展示
private void loadListData(boolean reverse, boolean vertical) {
    //数据初始化
    List<DataBean> datas = new ArrayList<>();
    for (int i = 0; i < DATAS.ICONS.length; i++) {
        DataBean bean = new DataBean();
        bean.icon = DATAS.ICONS[i];
        bean.name = "图片-" + i;
        datas.add(bean);
    }

    //RecyclerView加载数据
    //1. 设置布局管理器
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    //设置是否反向显示
    layoutManager.setReverseLayout(reverse);
    //设置显示的方向
    layoutManager.setOrientation(vertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
    mRecyclerView.setLayoutManager(layoutManager);

    //2. 设置适配器
    mRecyclerView.setAdapter(new ListAdapter(this, datas));
}
适配器:

public class ListAdapter
        extends RecyclerView.Adapter<ListAdapter.ListViewHolder>//标准的写法是本类名下的XXViewHolder extends RecyclerView.ViewHolder(即创建一个内部类继承RecyclerView.ViewHolder{
    private Context mContext;
    private List<DataBean> mDatas;//数据是由holder内的数据来决定的,所以要封装一个javabean作为容器

    //构造函数传入上下文和数据
    public ListAdapter(Context context, List<DataBean> datas) {
        this.mContext = context;
        this.mDatas = datas;
    }

    //一个条目就是一个holder,当holder而被创建的时候此方法被调用
    @Override
    public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //viewholder创建时的回调
        View view = View.inflate(mContext, R.layout.item_list, null);
        return new ListViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ListViewHolder holder, int position) {
        //viewholder和数据绑定时的回调
        //需要有数据
        DataBean bean = mDatas.get(position);
        holder.setData(bean);
    }

    @Override
    public int getItemCount() {
        //返回的是list数据个数
        if (mDatas != null) {
            return mDatas.size();
        }
        return 0;
    }

    //子布局中的viewid在这里实现
    public class ListViewHolder
            extends RecyclerView.ViewHolder {
        private ImageView ivIcon;
        private TextView tvName;

        public ListViewHolder(View itemView) {
            super(itemView);

            ivIcon = (ImageView) itemView.findViewById(R.id.item_list_iv_icon);
            tvName = (TextView) itemView.findViewById(R.id.item_list_tv_name);
        }

        public void setData(DataBean bean) {
            //设置数据的方法
            ivIcon.setImageResource(bean.icon);
            tvName.setText(bean.name);

        }
    }
}

2.类似gridview的展示:


//类似gridview的展示
private void loadGridData(boolean reverse, boolean vertical) {
    List<DataBean> datas = new ArrayList<>();
    for (int i = 0; i < DATAS.ICONS.length; i++) {
        DataBean bean = new DataBean();
        bean.icon = DATAS.ICONS[i];
        bean.name = "图片-" + i;
        datas.add(bean);
    }

    //1.布局管理器
    GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
    //设置是否反向显示
    layoutManager.setReverseLayout(reverse);
    //设置显示的方向
    layoutManager.setOrientation(vertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
    mRecyclerView.setLayoutManager(layoutManager);

    //2.设置adapter
    mRecyclerView.setAdapter(new GridAdapter(this, datas));
}
适配器:

public class GridAdapter
        extends RecyclerView.Adapter<GridAdapter.GridViewHolder>
{
    private Context        mContext;
    private List<DataBean> mDatas;

    public GridAdapter(Context context, List<DataBean> datas) {
        this.mContext = context;
        this.mDatas = datas;
    }

    @Override
    public GridViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //viewholder创建时的回调
        View view = View.inflate(mContext, R.layout.item_grid, null);
        return new GridViewHolder(view);
    }

    @Override
    public void onBindViewHolder(GridViewHolder holder, int position) {
        //viewholder和数据绑定时的回调
        //需要有数据
        DataBean bean = mDatas.get(position);
        holder.setData(bean);
    }

    @Override
    public int getItemCount() {
        //返回的是list数据个数
        if (mDatas != null) {
            return mDatas.size();
        }
        return 0;
    }

    public class GridViewHolder
            extends RecyclerView.ViewHolder
    {
        private ImageView ivIcon;
        private TextView tvName;

        public GridViewHolder(View itemView) {
            super(itemView);

            ivIcon = (ImageView) itemView.findViewById(R.id.item_list_iv_icon);
            tvName = (TextView) itemView.findViewById(R.id.item_list_tv_name);
        }

        public void setData(DataBean bean) {
            //设置数据的方法
            ivIcon.setImageResource(bean.icon);
            tvName.setText(bean.name);

        }
    }
}
3.瀑布流展示


private void loadStaggeredData(boolean reverse, boolean vertical) {
    List<DataBean> datas = new ArrayList<>();
    for (int i = 0; i < DATAS.PICS.length; i++) {
        DataBean bean = new DataBean();
        bean.icon = DATAS.PICS[i];
        bean.name = "图片-" + i;
        datas.add(bean);
    }

    //1.设置layoutmanager
    StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, vertical ?
            StaggeredGridLayoutManager.VERTICAL : StaggeredGridLayoutManager.HORIZONTAL);
    layoutManager.setReverseLayout(reverse);
    mRecyclerView.setLayoutManager(layoutManager);

    // 2.设置adapter
    mRecyclerView.setAdapter(new StaggeredAdapter(this, datas));
}
适配器:

public class StaggeredAdapter
        extends RecyclerView.Adapter<StaggeredAdapter.StaggeredViewHolder>
{
    private Context        mContext;
    private List<DataBean> mDatas;

    public StaggeredAdapter(Context context, List<DataBean> datas) {
        this.mContext = context;
        this.mDatas = datas;
    }

    @Override
    public StaggeredViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //viewholder创建时的回调
        View view = View.inflate(mContext, R.layout.item_staggered, null);
        return new StaggeredViewHolder(view);
    }

    @Override
    public void onBindViewHolder(StaggeredViewHolder holder, int position) {
        //viewholder和数据绑定时的回调
        //需要有数据
        DataBean bean = mDatas.get(position);
        holder.setData(bean);
    }

    @Override
    public int getItemCount() {
        //返回的是list数据个数
        if (mDatas != null) {
            return mDatas.size();
        }
        return 0;
    }

    public class StaggeredViewHolder
            extends RecyclerView.ViewHolder
    {
        private ImageView ivIcon;
        private TextView tvName;

        public StaggeredViewHolder(View itemView) {
            super(itemView);

            ivIcon = (ImageView) itemView.findViewById(R.id.item_list_iv_icon);
            tvName = (TextView) itemView.findViewById(R.id.item_list_tv_name);
        }

        public void setData(DataBean bean) {
            //设置数据的方法
            ivIcon.setImageResource(bean.icon);
            tvName.setText(bean.name);
        }
    }
}
源码下载

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值