Andriod RecyclerView的点击事件

1 与ListView 的比较

  • ListView不同, RecyclerView并没有提供类似于setOnItemClickListener( )这样的注册监听器方法,而是需要我们自己给子项具体的View去注册点击事件

  • 摒弃了ListView子项点击事件的监听器,所有的点击事件都有具体的View去注册

2 在自定义Adapter中设置点击事件

步骤:

  1. public FruitAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 中设置点击事件
  2. viewHolder 中获取子布局,并设置子布局的点击事件,这样可以在RecyclerView的子布局中点击子控件,并响应
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
    /**
     * 1. FruitAdapter 继承与RecyclerAdapter,
     * */
    private List<Fruit> fruits;
    // 1. 构造方法传入数据源
    public FruitAdapter(List<Fruit> fruits) {
        this.fruits = fruits;
    }

    @NonNull
    @Override
    // 创建ViewHolder实例, 将加载的布局放到构造函数中,并将View返回
    public FruitAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        // 将填充的view放到viewHolder中
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_layout_staggered, parent, false);
        ViewHolder holder = new ViewHolder(view);

        // 1. 在创建的时候进行点击事件
        // 从viewHolder中获取子空间, 添加点击事件

        // 1.1 子布局的点击事件
        holder.getFruitView().setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view1) {
                // 获取点击的位置,定位数组并输出信息
                int adapterPosition = holder.getAdapterPosition();
                Fruit fruit = fruits.get(adapterPosition);
                Toast.makeText(view1.getContext(), "点击的布局,其中内容为: " + fruit.getName(), Toast.LENGTH_SHORT).show();

            }
        });

        // 1.2 获取图片的点击事件
        holder.getFruitImage().setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view2) {
                int adapterPosition = holder.getAdapterPosition();
                Fruit fruit = fruits.get(adapterPosition);
                Toast.makeText(view2.getContext(), "点击图片的水果名称为: " + fruit.getName(), Toast.LENGTH_SHORT).show();
            }
        });

        // 1.3 为文本框指定点击事件
        holder.getFruitName().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view3) {
                String name = ((TextView)view3.findViewById(R.id.fruit_name)).getText().toString();
                Toast.makeText(view3.getContext(), name, Toast.LENGTH_SHORT).show();
            }
        });

        return holder;
    }

    @Override
    // 2. 每个子项滚动到屏幕内执行,通过 positon 得到当前项的实例,然后显示图片和文字,填充布局
    public void onBindViewHolder(@NonNull FruitAdapter.ViewHolder holder, int position) {
        Fruit fruit = fruits.get(position);
        holder.getFruitImage().setImageResource(fruit.getImageID());
        holder.getFruitName().setText(fruit.getName());
        holder.getFruitPrice().setText("$" + (double)fruit.getPrice()/100 + "/Kg");
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{
        // 添加ViewHolder中的控件
        private View fruitView;
        private ImageView fruitImage;
        private TextView fruitName;
        private TextView fruitPrice;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            this.fruitView = itemView;
            this.fruitImage = itemView.findViewById(R.id.fruit_image);
            this.fruitName = itemView.findViewById(R.id.fruit_name);
            this.fruitPrice = itemView.findViewById(R.id.fruit_price);
        }


        public void setFruitView(View fruitView) {
            this.fruitView = fruitView;
        }

        public void setFruitImage(ImageView fruitImage) {
            this.fruitImage = fruitImage;
        }

        public void setFruitName(TextView fruitName) {
            this.fruitName = fruitName;
        }

        public void setFruitPrice(TextView fruitPrice) {
            this.fruitPrice = fruitPrice;
        }

        public ImageView getFruitImage() {
            return fruitImage;
        }

        public TextView getFruitName() {
            return fruitName;
        }

        public TextView getFruitPrice() {
            return fruitPrice;
        }

        public View getFruitView() {
            return fruitView;
        }

    }
}

3 效果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值