玩转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
- 玩转RecyclerView
- 教你玩转 Android RecyclerView:深入解析 RecyclerView.ItemDecoration类(含实例讲解)
- 安卓日记——玩转Material Design(RecyclerView+CardView篇)
- 玩转指针,玩转C语言
- 玩转static, 玩转模块化设计
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- SpringMVC工作原理
- Eclipse中struts的引入
- Algorithm: Binary Tree(2) -- Special Trees (BST and Balanced Tree)
- 在windows桌面上画矩形框
- 性能测试知识思维导图
- 玩转RecyclerView
- oj2520: 小慧唱卡拉OK
- 软件测试面试常考点
- 【设计模式】策略模式
- 08:字符三角形
- Wpf ScrollViewer 右键菜单禁用
- C/C++ 引用,赋值,指针之间的区别
- NSIS知识技巧
- 接口和抽象类