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;
}*/
}