Material Design——RecyclerView

虽然RecyclerView要比ListView功能要强大一点,但是我很想问,为何RecyclerView没有设置子项监听事件的方法,使用RecyclerView还要自己编写设置监听的方法,还是挺麻烦的


今天我实现了一下为RecyclerView设置监听,代码如下

package com.example.lsn2_materialdesign_recyclerview;

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;


import java.util.List;

/**
 * Created by 艳霞 on 2018/4/7.
 */

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    List<String> list;
    public OnHolderViewClickListener mListener;


    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView tv;
        ImageView iv;
        LinearLayout linearLayout;
        OnHolderViewClickListener listener;
        int position;

        public MyViewHolder(View view){
            super(view);
            tv = (TextView) view.findViewById(R.id.text);
            iv = (ImageView) view.findViewById(R.id.image);
            linearLayout = (LinearLayout) view.findViewById(R.id.item);
        }
    }

    public MyAdapter(List<String> list){
        this.list = list;
    }

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

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position){
        holder.tv.setText(list.get(position));
        holder.iv.setBackgroundResource(R.drawable.listitem);
        holder.position = position;//我是在viewHolder中顶一个一个成员变量,用于保存position
        //我在子项的最外层嵌套了一个LinearLayout,同时设置一个id,通过为该LinearLayout设置一个点击事件来达到给RecyclerView的子项设置监听的效果
        holder.linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 //在LinearLayout的onClick方法中调用我们自定义的监听器的onClick方法
                 mListener.onClick(holder.position);
            }
        });
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1){
        MyViewHolder holder = new MyViewHolder(View.inflate(viewGroup.getContext(), R.layout.recyclerview_item, null));
        return holder;
    }


    public void addData(int position){
        list.add(position, "item"+position);
        // notifyDataSetChanged();//提示刷新,但是会影响效率
        notifyItemInserted(position);//通知RecyclerView有数据插入
    }

    //对外提供设置监听接口的方法
    public void setOnHolderViewClickListener(OnHolderViewClickListener listener){
        this.mListener = listener;
    }

    //在自己定义的Adapter中定义一个监听接口
    public interface OnHolderViewClickListener{
        void onClick(int position);
    }
}

因为只修改了这个类,其他类的代码就不贴了,来看看效果图


图片使我在网上随便找的,请忽略吧,点击item2时会弹出一个Toast文本


不过其实这有一个小小的bug,就是当你在某个位置插入元素之后,该位置原来的子项应该往后移,那么它的position应该加1才对,但是弹出的Toast提示却没有加一

这是我插入了一个item3,然后点击原来那个(即第二排第一个),弹出来文本并没有变化,这个待我仔细想想,之后再来更新,要是小伙伴有解决方法,可以在下方留言哦

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值