首页 > 其他分享 >RecyclerView 的学习记录

RecyclerView 的学习记录

时间:2022-08-15 19:47:48浏览次数:79  
标签:ViewHolder return 记录 param 学习 names RecyclerView public

官方文档

**RecyclerView 样式与适配器等解耦 **:

通过设置不同的 LayoutManager , 就可以实现不同的 布局展示样式 ;
通过设置不同的 ItemDecoration , 可以实现不同的 间隔样式 ;
通过设置不同的 ItemAnimator , 可以实现不同的添加 删除动画 ;

以 " 设置不同的 LayoutManager , 就可以实现不同的布局展示样式 " 为例 , 如 :
设置 LinearLayoutManager 布局管理器 , RecyclerView 展示的就是 横向 / 纵向 的列表 ;
设置 GridLayoutManager 布局管理器 , RecyclerView 展示的就是 网格布局 ;
设置 StaggeredGridLayoutManager 布局管理器 , RecyclerView 展示的就是 瀑布流 样式的布局 ;

RecyclerView 简单使用

public class MainActivity3 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        RecyclerView recyclerView = findViewById(R.id.recycler);

        //建立布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
        
        //瀑布流 交错网格布局管理器
        //StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, RecyclerView.VERTICAL);
        
        recyclerView.setLayoutManager(linearLayoutManager);

        //适配
        Adapter adapter = new Adapter();
        recyclerView.setAdapter(adapter);
    }


    /*
     * 自定义适配器
     * */
    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

        /**
         * 初始化布局文件
         *
         * @param parent
         * @param viewType
         * @return
         */
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View root_view = LayoutInflater.from(MainActivity3.this).inflate(R.layout.text_activity, parent, false);
            return new ViewHolder(root_view);
        }

        /**
         * 绑定数据
         *
         * @param holder
         * @param position
         */
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.item.setText("" + position);
        }

        @Override
        public int getItemCount() {
            return 7;
        }

        /**
         * 子布局容器
         */
        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView item;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                item = itemView.findViewById(R.id.item);
            }
        }
    }
}

RecyclerView 设置不同的item界面效果

public class MainActivity3 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        RecyclerView recyclerView = findViewById(R.id.recycler);

        //建立布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(RecyclerView.VERTICAL);

        //瀑布流 交错网格布局管理器
        //StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, RecyclerView.VERTICAL);

        recyclerView.setLayoutManager(linearLayoutManager);

        //适配
        Adapter adapter = new Adapter();
        recyclerView.setAdapter(adapter);
    }


    /*
     * 自定义适配器 --->RecyclerView.ViewHolder 多个item布局
     * */
    public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

        public static final int ITEM_TYPE_1 = 0;
        public static final int ITEM_TYPE_2 = 1;

        /**
         * 初始化布局文件
         *
         * @param parent
         * @param viewType
         * @return
         */
        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View root_view;
            switch (viewType) {
                case ITEM_TYPE_1:
                    root_view = LayoutInflater.from(MainActivity3.this).inflate(R.layout.text_activity, parent, false);
                    return new ViewHolder(root_view);
                case ITEM_TYPE_2:
                    root_view = LayoutInflater.from(MainActivity3.this).inflate(R.layout.item_image, parent, false);
                    return new ViewHolder2(root_view);
            }
            return null;
        }

        /**
         * 绑定数据
         *
         * @param holder
         * @param position
         */
        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
            switch (getItemViewType(position)) {
                case ITEM_TYPE_1:
                    ((ViewHolder) holder).item.setText("" + position);
                    break;
                case ITEM_TYPE_2:
                    ((ViewHolder2) holder).item.setText("" + position);
                    ((ViewHolder2) holder).image.setImageResource(R.mipmap.ic_launcher_round);
                    break;
            }
        }

        @Override
        public int getItemCount() {
            return 10;
        }

        @Override
        public int getItemViewType(int position) {
            return position % 2;
        }

        /**
         * 子布局容器
         */
        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView item;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                item = itemView.findViewById(R.id.item);
            }
        }

        public class ViewHolder2 extends RecyclerView.ViewHolder {
            TextView item;
            ImageView image;

            public ViewHolder2(@NonNull View itemView) {
                super(itemView);
                item = itemView.findViewById(R.id.item);
                image = itemView.findViewById(R.id.item_img);
            }
        }
    }
}

Item数据变化瀑布流

RecyclerView利用ItemTouchHelper 实现拖拽,左滑删除

public class MainActivity4 extends AppCompatActivity {

    /**
     * 数据源
     */
    private ArrayList<String> names = new ArrayList<String>();

    /**
     * 当前的 RecyclerView 列表
     */
    private RecyclerView recycler_view;

    /**
     * 布局管理器
     */
    private LinearLayoutManager layoutManager;

    /**
     * 适配器
     */
    private Adapter adapter;

    /**
     * 添加拖动处理
     */
    private ItemTouchHelper mItemTouchHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        // 初始化数据
        initData();

        //1 . 从布局中获取 RecyclerView
        recycler_view = findViewById(R.id.recycler);

        //2 . 创建并设置布局管理器
        //创建布局管理器
        layoutManager = new LinearLayoutManager(
                this,
                RecyclerView.VERTICAL,
                false);

        //设置布局管理器
        recycler_view.setLayoutManager(layoutManager);

        // 设置边距
       // recycler_view.addItemDecoration(new ItemDecoration());

        //3 . 创建并设置列表适配器
        adapter = new Adapter();
        recycler_view.setAdapter(adapter);

        //4. 添加拖动事件
        WwtCallback callback = new WwtCallback(adapter);
        mItemTouchHelper = new ItemTouchHelper(callback);
        mItemTouchHelper.attachToRecyclerView(recycler_view);
    }


    /**
     * 初始化数据
     */
    private void initData(){
        names.add("宋江");
        names.add("卢俊义");
        names.add("吴用");
        names.add("公孙胜");
        names.add("关胜");
        names.add("林冲");
        names.add("秦明");
        names.add("呼延灼");
        names.add("花荣");
        names.add("柴进");
        names.add("李应");
        names.add("朱仝");
        names.add("鲁智深");
        names.add("武松");
        names.add("董平");
        names.add("张清");
        names.add("杨志");
        names.add("徐宁");
        names.add("索超");
    }

    /**
     * RecyclerView 适配器
     */
    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

        private RecyclerView mRecyclerView;

        @Override
        public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
            this.mRecyclerView = recyclerView;
        }


        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View root_view = LayoutInflater.from(MainActivity4.this).inflate(R.layout.text_activity, parent, false);
            return new ViewHolder(root_view);
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.text.setText("" + names.get(position));
        }

        @Override
        public int getItemCount() {
            return names.size();
        }

        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView text;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                text = itemView.findViewById(R.id.item);
            }
        }

        /**
         * 删除元素调用的方法
         * @param position
         */
        public void deleteItem(int position) {
            names.remove(position);
            notifyItemRemoved(position);
        }

        /**
         * 交换条目元素
         * @param srcPosition
         * @param dstPosition
         */
        public void changeItem(int srcPosition, int dstPosition) {
            // 交换集合中两个元素位置
            Collections.swap(names, srcPosition, dstPosition);
            // 刷新界面显示
            notifyItemMoved(srcPosition, dstPosition);
        }
    }
}

ItemTouchHelper.java

public class WwtCallback extends ItemTouchHelper.Callback {

    private static final String TAG = "Callback";

    private MainActivity4.Adapter mAdapter;

    public WwtCallback(MainActivity4.Adapter mAdapter) {
        this.mAdapter = mAdapter;
    }

    /**
     * 设置上下左右动作
     * 只有在此处打开了指定方向的设置 , 才可以应用具体方向的拖动
     * @param recyclerView
     * @param viewHolder
     * @return
     */
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView,
                                @NonNull RecyclerView.ViewHolder viewHolder) {
        // 设置拖动方向, 此处设置上下拖动事件
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        // 设置滑动方向, 此处设置左右侧滑事件
        int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        // 应用 拖动 和 滑动 设置
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    /*
        以下是拖动相关方法
     */

    /**
     * 是否启用长按拖动功能
     * @return
     */
    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    /**
     * 拖动幅度设置
     * 组件在宽度 / 高度 上移动超过该比例 , 就认为拖动触发, 执行拖动相关操作
     * @param viewHolder
     * @return
     */
    @Override
    public float getMoveThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
        // 该案例中, 拖动操作只能上下进行
        // 拖动超过条目组件高度超过 0.9 倍, 即可触发拖动操作
        return 0.9f;
    }

    /**
     * 监听滑动事件
     * 滑动分 水平 / 垂直 两个方向
     * @param recyclerView
     * @param viewHolder
     * @param target
     * @return
     */
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView,
                          @NonNull RecyclerView.ViewHolder viewHolder,
                          @NonNull RecyclerView.ViewHolder target) {
        // 拖动后交换数据, 该方法中交换 Adapter 中的数据, 并刷新界面
        Log.i(TAG, "触发拖动交换条目");
        mAdapter.changeItem(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    /*
        以下是滑动相关方法
     */

    /**
     * 是否启用滑动操作
     * @return 是否启用 true 启用, false 不启用
     */
    @Override
    public boolean isItemViewSwipeEnabled() {
        return true;
    }

    /**
     * 用户滑动距离, 设置的是比例值, 返回值为 0.5 , 就意味着滑动宽度/高度的一半, 才触发侧滑 onSwiped 方法
     * @param viewHolder
     * @return
     */
    @Override
    public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
        return 0.5f;
    }

    /**
     * 滑动判定速度, 每秒移动的像素个数, 达到该速度后, 才可以被判定为滑动
     * @param defaultValue
     * @return
     */
    @Override
    public float getSwipeEscapeVelocity(float defaultValue) {
        return 5000f;
    }

    /**
     * 手指离开后的动画持续时间
     * @param recyclerView
     * @param animationType
     * @param animateDx
     * @param animateDy
     * @return
     */
    @Override
    public long getAnimationDuration(@NonNull RecyclerView recyclerView, int animationType, float animateDx, float animateDy) {
        return 200L;
    }

    /**
     * 滑动时的回调操作
     * @param viewHolder
     * @param direction
     */
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        Log.i(TAG, "触发侧滑删除条目");
        // 滑动指定的距离, 达到一定幅度后, 就会触发该方法回调
        // 这里做的是滑动删除功能, 直接删除滑动项
        // 该方法中删除指定条目, 并刷新界面
        mAdapter.deleteItem(viewHolder.getAdapterPosition());
    }
}

标签:ViewHolder,return,记录,param,学习,names,RecyclerView,public
From: https://www.cnblogs.com/kato-T/p/16589415.html

相关文章

  • 考研记录Week12【8.8~8.14】
    一、本周总结:使用时间:总计42h10min,高数:16h2min,线代:6h22min,英语单词:5h15min,英语真题3h,操作系统:9h3min,政治:2h31min.完成任务:数学:1.高数:辅导讲义结束√2.线代:880线代部分第7,......
  • Hadoop学习第一天
    学习课程是B站上的黑马程序员第一阶段主要是基础的概念,数据、大数据;大数据特点;数据分析的基本流程、方向;分布式、集群;操作系统,虚拟机。基本上就是这些基本概念的学习。第......
  • 日常开发记录-当新手前端遇到新手后端,分页没有页码
     后端提供的接口获取到数据list,但是后台管理系统的分页没有【页码数】和【前往“”页】,可能是后端没有把pageSize和pageIndex以及total返回给前端。......
  • git学习(06)git分支操作
    概述分支用于管理不同的线路的版本内容分支类似于科幻电影里面的平行宇宙,如果两个平行宇宙互不干扰,那就没什么影响。如果在某个时间点,两个平行宇宙合并了,就需要处理一......
  • 2022-08-15 第二小组 张鑫 学习笔记
    实训三十七天Mysql1.学习重点1.数据库2.MySQL3.SQL语言2.学习心得今天开始了数据库的学习,通过月测验我发现我存在很多知识上的欠缺,这都是平时每天的基础没有完全掌......
  • git学习(05)git文件操作
    文件的四种状态版本控制就是对文件的版本控制要对文件进行修改、提交等操作,首先要知道文件当前在什么状态。不然可能会提交了现在还不想提交的文件,或者要提交的文件没......
  • C++易忘知识点记录
    隐藏的默认构造函数没有参数的构造函数称为【默认构造函数】如果没有手动定义构造函数,编译器会给你一个【“隐藏的默认构造函数”】如果数据成员使用了【类内初始值】......
  • java学习路线整理
    java从入门到放弃:就业学习路线Java基础HTML、CSSJavaScriptmysqlJavaWebssmMyBatisSpringSpringMVCVueSpringBootSpringClouddocker......
  • python菜鸟学习: 5.字符串的基本用法
    #-*-coding:utf-8-*-str1="mynameisliyuzhoupan"#首字母大写print(str1.capitalize())#统计字符串中的字符出现的次数print(str1.count("n"))#自动补齐多......
  • 2022-08-15 第六组 Myy 学习笔记_Mysql数据库
    Mysql数据库数据库数据库【按照数据结构来组织、存储和管理数据的仓库】,是一个长期存储载计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据对于公......