提示:本章内容是在Android——RecycleView简单使用的基础上添加的。
一、RecyclerView点击和长按事件编写
RecyclerView不像ListView其本身提供了点击和长按的监听事件,在RecyclerView中我们需要我们自己在Adaper中定义。代码如下:
RecycleAdapterDome.java
package com.example.recycleviewdemo;
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;
/*
① 创建一个继承RecyclerView.Adapter<VH>的Adapter类
② 创建一个继承RecyclerView.ViewHolder的静态内部类
③ 在Adapter中实现3个方法:
onCreateViewHolder()
onBindViewHolder()
getItemCount()
*/
public class RecycleAdapterDome extends RecyclerView.Adapter<RecycleAdapterDome.MyViewHolder> {
private ContentProvider contentProvider;
//接口回调步骤2:定义成员变量
private OnItemListener onItemListener;
//构造方法,传入数据
public RecycleAdapterDome(){
contentProvider = new ContentProvider(10);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 引入自定义列表项的资源文件;
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.template, null);
//创建ViewHolder,返回每一项的布局
MyViewHolder myViewHolder = new MyViewHolder(v);
//在onCreateViewHolder()中为每个item添加点击事件
v.setOnClickListener(new RV_ItemListener());
v.setOnLongClickListener(new RV_ItemListener());
return myViewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//将数据和控件绑定
holder.tv1.setText(contentProvider.getProduct().get(position).toString());
holder.iv1.setImageResource(contentProvider.getImg().get(position));
//将数据保存在itemView的Id中,以便点击时进行获取
holder.itemView.setId(position);
}
@Override
public int getItemCount() {
//返回Item总条数
return contentProvider.getId().size();
}
//内部类,绑定控件
class MyViewHolder extends RecyclerView.ViewHolder{
TextView tv1;
ImageView iv1;
public MyViewHolder(View itemView) {
super(itemView);
tv1 = itemView.findViewById(R.id.tv1);
iv1 = itemView.findViewById(R.id.iv1);
}
}
//接口回调步骤1:定义监听接口类
public interface OnItemListener{
void OnItemClickListener(View view, int position);
void OnItemLongClickListener(View view, int position);
}
//接口回调步骤4:实现接口回调方法 将点击事件转移给外面的调用者
class RV_ItemListener implements View.OnClickListener, View.OnLongClickListener{
@Override
public void onClick(View view) {
if (onItemListener != null){
onItemListener.OnItemClickListener(view, view.getId());
}
}
@Override
public boolean onLongClick(View view) {
if (onItemListener != null){
onItemListener.OnItemLongClickListener(view,view.getId());
}
return true;
}
}
//接口回调步骤3:实例化 暴露给外面的调用者,定义Listener的方法()
public void setOnItemListenerListener(OnItemListener listener){
this.onItemListener = listener;
}
}
其主要步骤如下:
第一步:在RecycleAdapterDome类中定义监听接口OnItemListener类,详细如下:
public interface OnItemListener{
void OnItemClickListener(View view, int position);
void OnItemLongClickListener(View view, int position);
}
第二步:在RecycleAdapterDome类中编写RV_ItemListener内部类,实现接口回调方法将点击事件转移给外面的调用者
class RV_ItemListener implements View.OnClickListener, View.OnLongClickListener{
@Override
public void onClick(View view) {
if (onItemListener != null){
onItemListener.OnItemClickListener(view, view.getId());
}
}
@Override
public boolean onLongClick(View view) {
if (onItemListener != null){
onItemListener.OnItemLongClickListener(view,view.getId());
}
return true;
}
}
第三步:在RecycleAdapterDome类中编写setOnItemListenerListener(OnItemListener listener)方法,实例化暴露给外面的调用者,定义Listener的方法
public void setOnItemListenerListener(OnItemListener listener){
this.onItemListener = listener;
}
第四步:在RecycleAdapterDome类中的onCreateViewHolder(ViewGroup parent, int viewType) 方法中在onCreateViewHolder(ViewGroup parent, int viewType)中为每个item添加点击事件。
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 引入自定义列表项的资源文件;
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.template, null);
//创建ViewHolder,返回每一项的布局
MyViewHolder myViewHolder = new MyViewHolder(v);
//在onCreateViewHolder()中为每个item添加点击事件
v.setOnClickListener(new RV_ItemListener());
v.setOnLongClickListener(new RV_ItemListener());
return myViewHolder;
}
其主要步骤基本完成,一些细节可参考详细代码RecycleAdapterDome.java。
二、简单使用RecycleView的点击和长按事件
接下来我们需要在MainActivity.java中通过myAdapter.setOnItemListenerListener(new RecycleAdapterDome.OnItemListener() {……})编写点击和长按事件。
MainActivity.java
package com.example.recycleviewdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecycleAdapterDome myAdapter;
@SuppressLint("WrongConstant")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.myrecycleView);
//垂直显示效果
recyclerView.setLayoutManager(new LinearLayoutManager(
this,
LinearLayout.VERTICAL,
false));
//系统自带分割线
recyclerView.addItemDecoration(new DividerItemDecoration(
this,
DividerItemDecoration.VERTICAL));
//实现RecycleView点击和长按事件并编写触发事件
myAdapter = new RecycleAdapterDome();
myAdapter.setOnItemListenerListener(new RecycleAdapterDome.OnItemListener() {
@Override
public void OnItemClickListener(View view, int position) {
Toast.makeText(MainActivity.this,
"项目"+position+"被点击!",
Toast.LENGTH_SHORT).show();
}
@Override
public void OnItemLongClickListener(View view, int position) {
Toast.makeText(MainActivity.this,
"项目"+position+"被长按!",
Toast.LENGTH_SHORT).show();
}
});
recyclerView.setAdapter(myAdapter);
}
}
效果图如下:
链接:百度网盘下载 提取码:esst
推荐阅读:
Android——RecycleView简单使用