zoukankan      html  css  js  c++  java
  • Android数据列表展示之 RecylerView

    一、概述

    1.RecyclerView是什么?

    RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。该控件用于在有限的窗口中展示大量数据集,它被作为ListView和GridView控件的继承者。RecyclerView高度解耦,异常灵活,通过设置不同LayoutManager,ItemDecoration , ItemAnimator实现令人想象不到的效果

    2.RecyclerView怎么用?

    既然RecyclerView的出现是为了要替换ListView和GridView,那么他们必有共通之处,,是的他们都是通过适配器来绑定数据的。

    所以RecyclerView需要有如下东西支持:

    1.Datas : 要显示的数据集合

    2.Adapter:适配器,绑定数据集

    3.ViewHolder:根据当前数据保存视图,其实就是列表数据的单个item布局

    4.LayoutManager:布局管理者,决定列表数据摆放格式,是按照listview方式摆放还是按照gridview方式摆放,又或者是按照瀑布流方式,这就是Recyclerview强大的地方

    5.ItemDecoration:列表的分割器,Recyclerview默认没有给我们提供分割线,需自定义,后续会给出代码

    6.ItemAnimator: 当列表item被“添加”、“删除”,“位置变动”时执行什么动画,强大吧!

    7.Listener: item事件监听,RecyclerView默认不提供OnItemClickListener 点击事件,需我们自定义,灵活使用。

    二、RecyclerView的详细用法

    1.适配器和普通的适配器不一样,需要继承RecyclerView.Adapter

    2.listview使用时为了使用缓存,我们会定义一个ViewHolder类去存放布局控件,而RecyclerView 默认就支持这种方式,是不是更加方便了。

    public class UserAdapter extends RecyclerView.Adapter {
        private List<UserBean> userBeanList;
        private Context mContext;
        public UserAdapter(Context context,List<UserBean> userBeanList){
            mContext = context;
            this.userBeanList = userBeanList;
        }
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = View.inflate(mContext,R.layout.item_recycler_view,null);
            return new UserViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            if(holder instanceof UserViewHolder){
                UserViewHolder userViewHolder = (UserViewHolder) holder;
                UserBean userBean  = userBeanList.get(position);
                userViewHolder.name.setText(userBean.getName());
                userViewHolder.number.setText(userBean.getNumber());
            }
        }
    
        @Override
        public int getItemCount() {
            return userBeanList!=null?userBeanList.size():0;
        }
    
        class UserViewHolder extends RecyclerView.ViewHolder{
            private TextView name;
            private TextView number;
            public UserViewHolder(View itemView) {
                super(itemView);
                init(itemView);
                //给列表item点击点击事件
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(itemClickListener!=null){
                            itemClickListener.onItemClick(v,getLayoutPosition());
                        }
                    }
                });
            }
    
            private void init(View view){
                name = (TextView) view.findViewById(R.id.tv_name);
                number = (TextView) view.findViewById(R.id.tv_number);
            }
        }
    
        //对外部暴漏点击事件接口
        public interface OnItemClickListener{
            void onItemClick(View v,int position);
        }
    
        public OnItemClickListener itemClickListener;
    
        public void setItemClickListener(OnItemClickListener itemClickListener) {
            this.itemClickListener = itemClickListener;
        }
    }

    运行效果:

    源码地址:https://yunpan.cn/cu782gq6cEPD8 (提取码:a20d)

  • 相关阅读:
    Python基础系列----语法、数据类型、变量、编码
    Python基础系列----环境的搭建及简单输入、输出
    Python 从基础------进阶------算法 系列
    Python数据库访问公共组件及模拟Http请求
    急!急!急!请问win32api参数乱码如何解决!
    打印之Lodop
    Elasticsearch 6.7.2 源码编译
    ElasticSearch源码之——Gateway
    ElasticSearch源码之——Netty在Elasticsearch中的应用
    从BIO到Netty
  • 原文地址:https://www.cnblogs.com/android-zcq/p/5130087.html
Copyright © 2011-2022 走看看