RecycleView使用需要注意的地方

RecycleView虽然很强大,比如说高效,比如说高度解耦,比如说泛型的限制,比如说增加或者删除item的时候的高效刷新以及动画效果,但是强大了就没那么傻瓜化了,使用需要注意的地方这了稍微总结一下。

1,首先RecycleView是没有定义出onItemClick以及LongOnItemClick事件,需要使用者自己去定义回调listener接口。

在回调过程中也要注意一些细节,类似于快速滑动listview的时候展示的倒计时会错乱展示的一类问题,可能会出现:明明点击的是第1个item,但是回调监听提示的却说点击了第2个或者其他的item。

对于这类问题的解决方案:其实问题的原因是操作的item的position不统一导致的,解决办法就是,处理这个不统一,可以通过构造方法的方式来解决

import java.util.List;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;

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

    private List<String> list;
    private OnItemClickListener mOnItemClickListener;

    public MyRecyclerAdapter(List<String> list) {
        // TODO Auto-generated constructor stub
        this.list = list;
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView tv;

        public MyViewHolder(View view) {
            super(view);
            tv = (TextView)view.findViewById(android.R.id.text1);

        }

    }

    @Override
    public int getItemCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        //绑定数据
        holder.tv.setText(list.get(position));
        //进行非空判断来增强代码健壮性
        if(mOnItemClickListener!=null){
            holder.itemView.setOnClickListener(new OnClickListener() {
/**
  *所说的注意点就是这里,onBindViewHolder方法的position和onClick方法里面
  *的回调方法中的position不一致导致的问题。
  *解决办法:可以将这个onClick点击事件封装在一个内部类中,设置点击的时候就直接
  *将onBindViewHolder方法中的position通过构造传递进去,从而避免了,直到点击
  *了,执行了onClick方法才将position传递进去,也就避免了这个position的错乱。
  */
                @Override
                public void onClick(View v) {
                    mOnItemClickListener.onItemClick(v, position);
                }
            });
        }
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
        // 创建ViewHolder
        MyViewHolder holder = new MyViewHolder(View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null));
        return holder;
    }

    public void addData(int position){
        list.add(position,"additem"+position);
        //提示刷新--会影响效率
//      notifyDataSetChanged();
        notifyItemInserted(position);
    }
    public void removeData(int position){
        list.remove(position);
        notifyItemRemoved(position);
    }

    public interface OnItemClickListener{
        void onItemClick(View view, int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        this.mOnItemClickListener = listener;
    }


}

2,

猜你喜欢

转载自blog.csdn.net/jakezhang1990/article/details/81512901