1. 程式人生 > >使用RecyclerView繫結點選事件

使用RecyclerView繫結點選事件

       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);
        }
    }