虽然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,然后点击原来那个(即第二排第一个),弹出来文本并没有变化,这个待我仔细想想,之后再来更新,要是小伙伴有解决方法,可以在下方留言哦
 
                   
                   
                   
                   
                             本文介绍如何为RecyclerView设置子项监听事件,通过自定义监听接口和在ViewHolder中设置点击事件实现。解决了RecyclerView本身不支持直接设置子项监听的问题。
本文介绍如何为RecyclerView设置子项监听事件,通过自定义监听接口和在ViewHolder中设置点击事件实现。解决了RecyclerView本身不支持直接设置子项监听的问题。
           
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   2031
					2031
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            