玩转RecyclerView

来源:互联网 发布:恒大淘宝内部组织架构 编辑:程序博客网 时间:2024/05/21 13:54
这个是我的Activity
public class MainActivity extends AppCompatActivity implements  StarDragListener , ItemTouchMoveListener{    private List<QQMessage> mList ;    private RecyclerView mRecyclerView ;    private QQAdapter mAdapter ;   private  ItemTouchHelper mHelper;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        mList = DataUtils.init();        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));        mAdapter  = new QQAdapter(this , mList);        mRecyclerView.setAdapter(mAdapter);        ItemTouchHelper.Callback callBack = new MyItemTouchHelperCallball(this);        mHelper = new ItemTouchHelper(callBack);        //mRecyclerView的事件可以交给helper完成,helper回掉callBack        mHelper.attachToRecyclerView(mRecyclerView);    }    @Override    public void onStartDrag(RecyclerView.ViewHolder viewHolder) {        //viewHolder可以拖拽            mHelper.startDrag(viewHolder);    }    @Override    public boolean onItemMove(int fromPosition, int toPosition) {        mAdapter.onItemMove(fromPosition , toPosition);        return false;    }    @Override    public boolean onItemRemove(int position) {        mAdapter.onItemRemove(position);        return false;    }}
说一下Adapter  写一个Adapter需要继承
RecyclerView.Adapter<QQAdapter.MyViewHolder> 泛型就是你自己的ViewHolder
继承上面的类,必须重写三个方法
1.getItemCount() 返回展示条目数量
2.onCreateViewHolder(ViewGroup parent, int viewType) 在这里创建ViewHolder 并返回ViewHolder对象
3.onBindViewHolder(final MyViewHolder holder, int position)参数里面的
MyViewHolder holder就是上面你自己创建的holder ,这里给MyViewHolder holder设置数据,
系统会自动展示参数中的holder, 缓存复用也是系统做的,我们在这里只需要关心给holder设置数据就好了
public class QQAdapter  extends RecyclerView.Adapter<QQAdapter.MyViewHolder> implements  ItemTouchMoveListener{    private List<QQMessage> mlist ;    private StarDragListener startDragListener;    public QQAdapter(StarDragListener startDragListener , List list){        this.mlist = list ;        this.startDragListener = startDragListener;        Log.e("mac1", this.startDragListener+" ===============" );    }    //负责生产ViewHolder    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view  = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem,parent,false);        return new MyViewHolder(view);    }    @Override    public void onBindViewHolder(final MyViewHolder holder, int position) {        QQMessage qqMessage = mlist.get(position) ;        holder.iv_logo.setImageResource(qqMessage.getLogo());        holder.tv_name.setText(qqMessage.getName());        holder.tv_Msg.setText(qqMessage.getLastMsg());        holder.tv_time.setText(qqMessage.getTime());        holder.iv_logo.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                if(event.getAction() == MotionEvent.ACTION_DOWN){                    Log.e("mac2", holder+" ===============" );//传递触摸事件  给callBack                    startDragListener.onStartDrag(holder);                }                return false;            }        });    }    @Override    public int getItemCount() {        return mlist.size();    }    @Override    public boolean onItemMove(int fromPosition, int toPosition) {        Collections.swap(mlist , fromPosition , toPosition );        notifyItemMoved(fromPosition ,toPosition );        return true ;    }    @Override    public boolean onItemRemove(int position) {        mlist.remove(position) ;        notifyItemRemoved(position);        return false;    }    class MyViewHolder extends RecyclerView.ViewHolder {        private ImageView iv_logo;        private TextView tv_name;        private TextView tv_Msg;        private TextView tv_time;        public MyViewHolder(View v){            super(v);            iv_logo = (ImageView)itemView.findViewById(R.id.iv_logo);            tv_name = (TextView)itemView.findViewById(R.id.tv_name);            tv_Msg = (TextView)itemView.findViewById(R.id.tv_lastMsg);            tv_time = (TextView)itemView.findViewById(R.id.tv_time);        }    }//end class}

callBack 设计的很好
RecyclerView的事件交给Helper处理,helper处理完会回掉callBack中的方法
getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
固定写法 下面的代码是holder上下左右都能拖动
onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
holder拖动的时候被调用
 public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction)
holder滑动的时候调用
isLongPressDragEnabled()
holder长按是否开启
 onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)
状态改变时调用  一般三种情况  
public class MyItemTouchHelperCallball  extends ItemTouchHelper.Callback{   private ItemTouchMoveListener mItemTouchMoveListener ;    public MyItemTouchHelperCallball(ItemTouchMoveListener itemTouchMoveListener){            this.mItemTouchMoveListener  = itemTouchMoveListener ;    }    @Override    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {       int dragFlags =  ItemTouchHelper.UP | ItemTouchHelper.DOWN ;       int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT ;       int flags = makeMovementFlags(dragFlags , swipeFlags) ;       return flags;    }    @Override    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {        if(viewHolder.getItemViewType()!=target.getItemViewType()){            return false;        }    boolean result = mItemTouchMoveListener.onItemMove(viewHolder.getAdapterPosition() , target.getAdapterPosition());        return result;    }    @Override    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {        mItemTouchMoveListener . onItemRemove( viewHolder.getAdapterPosition()  ) ;    }    @Override    public boolean isLongPressDragEnabled() {        return true;    }    @Override    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {//恢复        viewHolder.itemView.setBackgroundColor(Color.WHITE);        // viewHolder.itemView.setScaleX(1);//1~0 解决课上的最后一个bug        // viewHolder.itemView.setScaleY(1);//1~0        super.clearView(recyclerView, viewHolder);    }    @Override    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder            , float dX, float dY            , int actionState, boolean isCurrentlyActive)    {//    dx   水平方向移动的增量        if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){            //透明度动画            //viewHolder.itemView.setAlpha(1-Math.abs((int)(dX/viewHolder.itemView.getWidth())));  //            //dX:水平方向移动的增量(负:往左;正:往右)范围:0~View.getWidth  0~1            if(actionState==ItemTouchHelper.ACTION_STATE_SWIPE){                //透明度动画                float alpha = 1-Math.abs(dX)/viewHolder.itemView.getWidth();                viewHolder.itemView.setAlpha(alpha);//1~0                viewHolder.itemView.setScaleX(alpha);//1~0                viewHolder.itemView.setScaleY(alpha);//1~0            }        }        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);    }    @Override    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {        if(actionState != ItemTouchHelper.ACTION_STATE_IDLE){            viewHolder.itemView.setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(R.color.colorPrimary));        }        super.onSelectedChanged(viewHolder, actionState);    }}

                                             
0 0