Android——RecycleView点击和长按事件的使用

提示:本章内容是在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);

    }

}

效果图如下:
在这里插入图片描述

发布了6 篇原创文章 · 获赞 3 · 访问量 2032

猜你喜欢

转载自blog.csdn.net/qq_43567345/article/details/104171590
今日推荐