RecyclerView 条目换位

mainActivirt.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rl_data"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

itme_home.xml

<?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_margin="5dp"
        android:background="@drawable/item_bg"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/id_num"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center"
            android:text="1" />
    </FrameLayout>

   item_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:drawable="@color/colorPrimaryDark"></item>
    <item android:drawable="@color/colorAccent"></item>
</selector>

 

itme_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/iv_data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher" />
    <TextView
        android:layout_gravity="center"
        android:paddingLeft="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_data"/>

</LinearLayout>

ItemTouchMoveListener

public interface ItemTouchMoveListener {

    /**
     * 当拖拽的时候回调
     * 可以在此方法实现拖拽条目,并实现刷新效果
     * @param fromPosition 从什么位置拖拽
     * @param toPosition 到什么位置
     * @return  是否执行
     */
    boolean onItemMove(int fromPosition, int toPosition);

    /**
     * 当条目被移除的回调
     * @param position
     * @return
     */
    boolean onItemRemove( int position);
}

MyItemTouchHelperCallBack

public class MyItemTouchHelperCallBack extends ItemTouchHelper.Callback {
    private ItemTouchMoveListener mItemTouchMoveListener;

    public MyItemTouchHelperCallBack(ItemTouchMoveListener itemTouchMoveListener) {
        mItemTouchMoveListener = itemTouchMoveListener;
    }

    //callback回调监听先调用的,用来判断是什么动作,比如判断方向(意思就是我要监听那个方向的拖到)
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        //方向Up,down.left,right
        //ItemTouchHelper.UP,ItemTouchHelper.DOWN,ItemTouchHelper.LEFT,ItemTouchHelper.RIGHT
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//添加上下滑动
        //int swipeFlags = 0;
        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;
        }


        //adapter.notifyItemMoved(fromPosition,toPosition);改变拖拽item位置
        mItemTouchMoveListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return false;
    }

    //侧滑
    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        //监听侧滑1:删除数据;2:adapter.notifyItemRemove(position)
        mItemTouchMoveListener.onItemRemove(viewHolder.getAdapterPosition());

    }

    //item改变状态
    @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);

    }

    //状态背景颜色复原

    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

        viewHolder.itemView.setBackgroundColor(Color.WHITE);

        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){
            //设置透明度1-0
            float result = Math.abs(dX) / viewHolder.itemView.getWidth();
            viewHolder.itemView.setAlpha(result);

            //旋转
            viewHolder.itemView.setScaleX(result);
            viewHolder.itemView.setScaleY(result);

        }

        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }

    @Override
    public boolean isLongPressDragEnabled() {
        //是否允许长按拖拽
        return true;
    }


}

MyRecyclerViewAdapter

public class MyRecyclerViewAdapter  extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> implements ItemTouchMoveListener{
    private Context mContext;
    private List<String> number;
    private OnStartDragListener mListener;

    public MyRecyclerViewAdapter(Context context, List<String> number, OnStartDragListener listener) {
        mContext = context;
        this.number = number;
        this.mListener = listener;
    }
    //在adapter里面加ItemTouchMoveListener和在MainActivity加有什么区别?
    @Override
    public boolean onItemMove(int fromPosition, int toPosition) {
        //1:数据交换;  2:刷新

        Collections.swap(number,fromPosition,toPosition);
        notifyItemMoved(fromPosition,toPosition);
        return false;
    }

    @Override
    public boolean onItemRemove(int position) {
        //1:删除数据;  2:刷新
        number.remove(position);
        notifyItemRemoved(position);
        return false;
    }

    class
    MyViewHolder extends RecyclerView.ViewHolder {

        private TextView tv_data;
        private ImageView iv_data;

        public MyViewHolder(View itemView) {
            super(itemView);
            tv_data = itemView.findViewById(R.id.tv_data);
            iv_data = itemView.findViewById(R.id.iv_data);
        }
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View inflate = LayoutInflater.from(mContext).inflate(R.layout.item_layout, parent, false);
        MyViewHolder myViewHolder = new MyViewHolder(inflate);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        holder.tv_data.setText(number.get(position));
        holder.iv_data.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    //传递触摸情况给谁,进行按下图片拖拽
                    mListener.onStartDrag(holder);
                }

                return false;
            }
        });


    }

    @Override
    public int getItemCount() {
        return number.size();
    }


}

 

OnStartDragListener

public interface OnStartDragListener {

    /**
     * 该接口用于需要主动回调拖拽效果的
     * @param viewHolder
     */
    void onStartDrag(RecyclerView.ViewHolder viewHolder);

}

MainActivity

public class MainActivity extends AppCompatActivity  implements OnStartDragListener /*,ItemTouchMoveListener*/ {
    private RecyclerView rl_data;

    private List<String> number;
    MyRecyclerViewAdapter adapter;
    ItemTouchHelper itemTouchHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rl_data = findViewById(R.id.rl_data);
        rl_data.setLayoutManager(new LinearLayoutManager(this));
        number = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            number.add("序列号" + i);
        }
        adapter = new MyRecyclerViewAdapter(this, number,this);
        rl_data.setAdapter(adapter);
        MyItemTouchHelperCallBack callback = new MyItemTouchHelperCallBack(adapter);
        itemTouchHelper = new ItemTouchHelper(callback);
        itemTouchHelper.attachToRecyclerView(rl_data);
        //itemTouchHelper.startDrag(viewholder);用接口回调OnStartDragListener()
        //itemTouchHelper.startSwipe(viewholder);
    }



    @Override
    public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
        itemTouchHelper.startDrag(viewHolder);
    }


   /* @Override
    public boolean onItemMove(int fromPosition, int toPosition) {
        //1:数据交换;  2:刷新
        Collections.swap(number,fromPosition,toPosition);
        adapter.notifyItemMoved(fromPosition,toPosition);
        return false;
    }
   @Override
    public boolean onItemRemove(int position) {
        //1:删除数据;  2:刷新
        number.remove(position);
        adapter.notifyItemRemoved(position);
        return false;
    }*/
}

猜你喜欢

转载自blog.csdn.net/zzf0521/article/details/82786326