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