虽然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,然后点击原来那个(即第二排第一个),弹出来文本并没有变化,这个待我仔细想想,之后再来更新,要是小伙伴有解决方法,可以在下方留言哦