安卓进阶系列-05列表控件(RecyclerView)的使用

RecyclerView的使用

  • 前言
    • 在之前的博客中我介绍了ListView如何使用,当然那部分博客由于没有考虑基础的问题,写的跨度太大,后面我会全部重构的。
    • ListView是一个滑动列表控件,随着手指的滑动,让屏幕外的内容到达屏幕内,屏幕内的内容移除屏幕区域,一度被认为这是最常用也最难用的控件。(焦点、高度等问题层出不穷)但是,ListView有几个致命的弊端,尤其的就是运行效率了,可能小项目还看不出来,但是填充数据大的时候,ListView的劣势就体现出来了。
    • 当然,在之前,我们选择两种主要手段提高效率。(即使用convertView代替getView(),建立内部类ViewHolder缓存控件示例,避免重复控件绑定)
  • 背景
    • 为了方便用户的使用,拜托ListView的限制(只能纵向延伸),官方新增了控件RecyclerView,它被放在support库中,所以使用需要添加依赖如下.
      • implementation 'com.android.support:recyclerview-v7:27.1.1'
    • 相比于ListView它优化了效率,且支持横向滚动和瀑布流布局。还有很多优点可以查看官方文档。
  • 使用
    • 布局中加入:编辑默认生成的activity_main.xml如下,添加控件如下
      • <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>
    • 创建适配器:创建java文件MyRecycleViewAdapter.java
      • package com.zc.testforrecyclerview;
        
        import android.support.annotation.NonNull;
        import android.support.v7.widget.RecyclerView;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.TextView;
        import android.widget.Toast;
        
        import java.util.List;
        
        public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
            private List<String> mData;
            static class ViewHolder extends RecyclerView.ViewHolder{
                View myView;
                TextView content;
                public ViewHolder(View view){
                    super(view);
                    myView = view;
                    content = view.findViewById(R.id.content);
                }
            }
        
            public MyRecyclerViewAdapter(List<String> Data){
                mData = Data;
            }
        
            @NonNull
            @Override
            public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.content, null, false);
                final ViewHolder holder = new ViewHolder(view);
                holder.myView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        int position = holder.getAdapterPosition();
                        String str = mData.get(position);
                        Toast.makeText(view.getContext(), "你点击了第"+Integer.toString(position)+"项", Toast.LENGTH_LONG).show();
                    }
                });
                return holder;
            }
        
            @Override
            public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
                String name = mData.get(position);
                holder.content.setText(name);
            }
        
            @Override
            public int getItemCount() {
                return mData.size();
            }
        }
        

         

    • 注册点击事件
      • 很遗憾,RecyclerView没有提供类似ListView那样的setOnItemClickListener的方法,当然这不是没写,而是ListView注册事件不是很人性化,它注册的是子项事件但是当我想要点击子项中的某个控件就有很多焦点问题,处理比较麻烦,RecyclerView没有这个问题,他的点击事件写在适配器中。
      • 见上面代码。
    • 运行结果
  • 补充说明
    • 参考书《第一行代码》
    • 具体项目完整代码见我的GitHub,上层目录也有Kotlin代码。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章