RecycleView适配器点击事件完美封装

目的:因为很多场景,我们需要区分控件点击事件,adapter点击事件,还是长按事件,但是recycleview本身没有点击事件的接口,自己写三个接口,分别适应多种场景

step1: RecycleViewTwoDemo\app\src\main\java\com\example\recycleviewtwodemo\MainActivity.java

package com.example.recycleviewtwodemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private List<String> mDevices;
    private RecyclerView gv_devices;
    private OnlineDeviceListAdapter mAdapter;

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

        gv_devices = findViewById(R.id.rv_online_devices);

        mDevices = new ArrayList<>();
        mDevices.add("tom");
        mDevices.add("bob");
        mDevices.add("alice");

        mAdapter = new OnlineDeviceListAdapter(MainActivity.this, mDevices);
        gv_devices.setLayoutManager(new GridLayoutManager(MainActivity.this, 2));
        gv_devices.setAdapter(mAdapter);

        mAdapter.setOnViewClickListener(new BaseRecyclerViewAdapter.OnViewClickListener() {
            @Override
            public void onViewClick(View view, int position) {
                Log.e("TAG", view + ":onViewClick:" + position);
            }
        });

        mAdapter.setOnItemClickListener(new BaseRecyclerViewAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Log.e("TAG", "onItemClick:" + position);
            }
        });


        mAdapter.setOnItemLongClickListener(new BaseRecyclerViewAdapter.OnItemLongClickListener() {
            @Override
            public boolean onLongClick(int position) {
                Log.e("TAG", "onLongClick:" + position);
                return true;    //true表示事件不向下传递
            }
        });

    }
}

step2: RecycleViewTwoDemo\app\src\main\java\com\example\recycleviewtwodemo\BaseRecyclerViewAdapter.java

package com.example.recycleviewtwodemo;


import android.view.View;

import androidx.recyclerview.widget.RecyclerView;

/**
 * Created by kee on 2017/12/25.
 */

public abstract class BaseRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> implements View.OnClickListener, View.OnLongClickListener {

    public OnItemClickListener onItemClickListener;
    public OnItemLongClickListener onItemLongClickListener;
    public OnViewClickListener onViewClickListener;


    @Override
    public void onBindViewHolder(VH holder, int position) {
        holder.itemView.setTag(position);
        holder.itemView.setOnClickListener(this);
        holder.itemView.setOnLongClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (onItemClickListener != null) {
            onItemClickListener.onItemClick((Integer) v.getTag());
        }
    }

    @Override
    public boolean onLongClick(View v) {
        if (onItemLongClickListener != null) {
            return onItemLongClickListener.onLongClick((Integer) v.getTag());
        }
        return false;
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
        this.onItemLongClickListener = onItemLongClickListener;
    }


    public void setOnViewClickListener(OnViewClickListener onViewClickListener) {
        this.onViewClickListener = onViewClickListener;
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public interface OnItemLongClickListener {
        boolean onLongClick(int position);
    }

    public interface OnViewClickListener {
        void onViewClick(View view, int position);
    }
}

step3: RecycleViewTwoDemo\app\src\main\java\com\example\recycleviewtwodemo\OnlineDeviceListAdapter.java

package com.example.recycleviewtwodemo;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;


import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

/**
 * online devices
 * Created by Administrator on 2016/10/25.
 */
public class OnlineDeviceListAdapter extends BaseRecyclerViewAdapter<OnlineDeviceListAdapter.ViewHolder> {
    List<String> mDevices;
    Context mContext;

    public OnlineDeviceListAdapter(Context context, List<String> devices) {
        mContext = context;
        mDevices = devices;
    }

    public void resetDevices(List<String> devices) {
        this.mDevices = devices;
        notifyDataSetChanged();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_online_device, null, false);
        ViewHolder holder = new ViewHolder(itemView);
        holder.tv_name = itemView.findViewById(R.id.tv_name);
        holder.img_icon = itemView.findViewById(R.id.img_icon);
        return holder;
    }

    @Override
    public int getItemCount() {
        return mDevices == null ? 0 : mDevices.size();
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        super.onBindViewHolder(holder, position);
        holder.tv_name.setText(mDevices.get(position));
        holder.tv_name.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                //  listener.itemOnClick(103,position);
                onViewClickListener.onViewClick(view, position);
            }
        });
    }

    class ViewHolder extends RecyclerView.ViewHolder {


        public ImageView img_icon;
        public TextView tv_name;

        public ViewHolder(View itemView) {
            super(itemView);
        }
    }
}

step4: D:\workspace\RecycleViewTwoDemo\app\src\main\res\layout\activity_main.xml

<?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="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_online_devices"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

step5: D:\workspace\RecycleViewTwoDemo\app\src\main\res\layout\item_online_device.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="8dp">

    <ImageView
        android:id="@+id/img_icon"
        android:layout_width="36dp"
        android:layout_height="36dp"
        android:scaleType="fitCenter"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:layout_marginTop="4dp"
        android:background="@android:color/holo_red_light"
        android:gravity="center"
        android:text="sample"
        android:textSize="11sp" />

</LinearLayout>

run,success!!

end