使用RecyclerView繫結點選事件
阿新 • • 發佈:2019-01-26
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);
}
}