RecyclerView使用(一)

概述

RecyclerView是什么

从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。

初步使用的步骤

  1. build.gradle中添加所需依赖
 implementation 'com.android.support:recyclerview-v7:27.1.1'
  1. xml文件中添加控件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</FrameLayout>
  • 创建适配器Adapter

  • 创建Adapter继承自RecyclerView.Adapter< ViewHolder >

  • ViewHolder为自己创建的内部类继承自RecyclerView.ViewHolder

  • 必须实现

    • onCreateViewHolder(@NonNull ViewGroup parent, int viewType)方法
      创建RecyclerView的子cell布局

    • onBindViewHolder(@NonNull ViewHolder holder, int position)方法
      完成数据绑定等

    • getItemCount()获取数据总条目

    • 子cell布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <ImageView
        android:layout_marginStart="16dp"
        android:src="@mipmap/ic_launcher"
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:layout_gravity="center_vertical"
        android:text="@string/app_name"
        android:id="@+id/title"
        android:gravity="center"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content" />

</LinearLayout>
View root = LayoutInflater.from(context).inflate(R.layout.cell_item, parent, false);
public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> implements View.OnClickListener,
        View.OnLongClickListener {
    private List<Data> dataList;
    private Context context;
    private Data data;
    private OnItemClickListener<Data> listener;

    public void setListener(OnItemClickListener<Data> listener) {
        this.listener = listener;
    }

    public static abstract class AdapterOnClickListenerImpl implements OnItemClickListener<Data> {
        @Override
        public void onItemClicked(ViewHolder holder, Data o) {

        }

        @Override
        public void onItemLongClicked(ViewHolder holder, Data o) {

        }
    }

    @Override
    public void onClick(View v) {
        ViewHolder holder = (ViewHolder) v.getTag(R.id.tag_recycler_holder);
        if (this.listener != null) {
            int position = holder.getAdapterPosition();
            this.listener.onItemClicked(holder, dataList.get(position));
        }
    }

    @Override
    public boolean onLongClick(View v) {
        ViewHolder holder = (ViewHolder) v.getTag(R.id.tag_recycler_holder);
        if (this.listener != null) {
            int position = holder.getAdapterPosition();
            this.listener.onItemLongClicked(holder, dataList.get(position));
        }
        return true;
    }

    public interface OnItemClickListener<Data> {
        void onItemClicked(ViewHolder holder, Data data);

        void onItemLongClicked(ViewHolder holder, Data data);
    }


    public Adapter(List<Data> dataList, Context context) {
        this.dataList = dataList;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View root = LayoutInflater.from(context).inflate(R.layout.cell_item, parent, false);
        ViewHolder holder = new ViewHolder(root);
        root.setTag(R.id.tag_recycler_holder, holder);
        root.setOnClickListener(this);
        root.setOnLongClickListener(this);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Data dt = dataList.get(position);
        holder.title.setText(dt.getTitle());
    }

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

    class ViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        TextView title;

        public ViewHolder(View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.image);
            title = itemView.findViewById(R.id.title);
        }
    }
}
  • 找到并初始化RecyclerView

  • 设置布局管理器,RecyclerView的显示方式在此设置

  • 初始化适配器-初始化数据

  • 设置适配器

public class MainActivity extends AppCompatActivity {

    private RecyclerView recycler;

    private List<Data> dataList;
    private Adapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recycler = findViewById(R.id.recycler);
        initData();
        adapter = new Adapter(dataList,this);
        recycler.setLayoutManager(new LinearLayoutManager(this));
        recycler.setAdapter(adapter);
        adapter.setListener(new Adapter.AdapterOnClickListenerImpl() {
            @Override
            public void onItemClicked(Adapter.ViewHolder holder, Data o) {
                Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClicked(Adapter.ViewHolder holder, Data o) {
                Toast.makeText(MainActivity.this,"onLongClick",Toast.LENGTH_SHORT).show();
            }
        });

    }

    private void initData() {
        dataList = new ArrayList<>();
        for (int i = 0;i<5;i++){
            Data data = new Data();
            data.setTitle("title--->"+i);
            dataList.add(data);
        }
    }
}

简单使用如上

给RecyclerView的子item添加长按事件以及点击事件

  1. 在adapter中添加监听的回调接口
    public interface OnItemClickListener<Data> {
        /**
         * @param holder holder
         * @param data 数据
         */
        void onItemClicked(ViewHolder holder, Data data);
        /**
         * @param holder holder
         * @param data 数据
         */
        void onItemLongClicked(ViewHolder holder, Data data);
    }
  1. Adapter中添加接口实例并添加set方法
    private OnItemClickListener<Data> listener;

    public void setListener(OnItemClickListener<Data> listener) {
        this.listener = listener;
    }

  1. Adapter实现View.OnClickListener, View.OnLongClickListener
  2. 将item的点击事件转交给自己设置的监听接口
    @Override
    public void onClick(View v) {
        ViewHolder holder = (ViewHolder) v.getTag(R.id.tag_recycler_holder);
        if (this.listener != null) {
            int position = holder.getAdapterPosition();
            this.listener.onItemClicked(holder, dataList.get(position));
        }
    }

    @Override
    public boolean onLongClick(View v) {
        ViewHolder holder = (ViewHolder) v.getTag(R.id.tag_recycler_holder);
        if (this.listener != null) {
            int position = holder.getAdapterPosition();
            this.listener.onItemLongClicked(holder, dataList.get(position));
        }
        return true;
    }

  1. 设置adapter前添加监听
       adapter.setListener(new Adapter.AdapterOnClickListenerImpl() {
            @Override
            public void onItemClicked(Adapter.ViewHolder holder, Data o) {
                Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClicked(Adapter.ViewHolder holder, Data o) {
                Toast.makeText(MainActivity.this,"onLongClick",Toast.LENGTH_SHORT).show();
            }
        });

    }
  1. 以上方法每次使用时都必须实现2个点击的方法,做出如下优化->根据业务实现有用的监听
  2. 在Adapter中添加
    public static abstract class AdapterOnClickListenerImpl implements OnItemClickListener<Data> {
        @Override
        public void onItemClicked(ViewHolder holder, Data o) {

        }

        @Override
        public void onItemLongClicked(ViewHolder holder, Data o) {

        }
    }

简单的RecyclerView使用方法就是这样啦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值