使用RecyclerView绑定点击事件

来源:互联网 发布:mac上好用的tex编辑器 编辑:程序博客网 时间:2024/05/21 06:35

       RecyclerView在设置点击事件时 如果不使用notifyDataSetChanged();来通知界面更新的话是不会主动调用onBindViewHolder(ViewHolder holder,int position)这个方法.而绑定点击事件需要在这里进行绑定并且将position传入进去进行相应的操作.如果我们进行移动,删除,添加,但是没有调用该方法的话,点击绑定的position就会和界面真正的position不一样.使用notifyDataSetChanged();会重新执行onBindViewHolder()所以不会出现错乱现象.但是RecyclerView.Adapter提供了以下几个通知界面更新的方法:

  • notifyItemChanged(int position)
  • notifyItemRangeChanged(int positionStart, int itemCount)
  • notifyItemInserted(int position)
  • notifyItemRangeInserted(int positionStart, int itemCount)
  • notifyItemRemoved(int position)
  • notifyItemRangeRemoved(int positionStart, int itemCount)
  • notifyItemMoved(int fromPosition, int toPosition)

       就是通知item改变,删除,添加和移动给Recyclerview,RecyclerView会做出相应的动画效果来显示这个状态的变更.使用这几个方法通知界面变更不会调用onBindViewHolder这个方法,不过我又希望能有动画效果.所以直接通过onBindViewHolder传入的posiition是不能用了有没有什么方法可以获得子item的posiition呢?然后我发现RecyclerView提供下面这个方法:

public int getChildAdapterPosition(View child) {        final ViewHolder holder = getChildViewHolderInt(child);        return holder != null ? holder.getAdapterPosition() : NO_POSITION;    }

所以使用ViewHolder.getAdapterPosition()获取位置信息就好了.

class RecyclerAdapter extends RecyclerView.Adapter<ViewHolder>{        private LinkedList<String> temp;        RecyclerAdapter(LinkedList<String> list){            temp = list;        }        @Override        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            mRecyclerView = (RecyclerView) parent;            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler_view,parent,false);            ViewHolder holder = new ViewHolder(view);            return holder;        }        @Override        public void onBindViewHolder(final ViewHolder holder,  int position) {            holder.mImageView.setImageResource(R.mipmap.ic_launcher);            holder.mTextView.setText(names.get(position));            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {                @Override                public boolean onLongClick(View v) {                    int index = holder.getAdapterPosition();//获取item在adapter中的位置                    temp.add(index+6,temp.get(index));                    temp.remove(index);                    notifyItemMoved(index, index + 5);                    return false;                }            });        }        @Override        public int getItemCount() {            return temp.size();        }    }    class ViewHolder extends RecyclerView.ViewHolder{        private ImageView mImageView;        private TextView mTextView;        private View itemView;        public ViewHolder(View itemView) {            super(itemView);            this.itemView = itemView;            mImageView = (ImageView) itemView.findViewById(R.id.image);            mTextView = (TextView) itemView.findViewById(R.id.text);        }    }
0 0