RecycleView功能強大,很簡單的幾個步驟就能滿足我們的開發需求,首先來三個效果
上圖是動畫,相當於加載數據的時候一個簡單的動畫效果
上圖是拖拽,能夠選擇一行進行上下拖拽和任意一行進行交換
上圖是刪除,對不用的選項可以進行刪除
下面對以上的效果一一進行講解
首先是動畫效果
創建動畫的xml文件item_animation_fall_down.xml,這裏面寫的是旋轉,平移,縮放等一些基本參數的介紹
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300">
<translate
android:fromYDelta="-20%"
android:toYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
/>
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:interpolator="@android:anim/decelerate_interpolator"
/>
<scale
android:fromXScale="105%"
android:fromYScale="105%"
android:toXScale="100%"
android:toYScale="100%"
android:pivotX="50%"
android:pivotY="50%"
android:interpolator="@android:anim/decelerate_interpolator"
/>
</set>
再創建動畫控制
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_fall_down"
android:delay="15%"
android:animationOrder="normal" />
加載動畫到RecycleView的控件上
int resId = R.anim.layout_animation_fall_down;
LayoutAnimationController animation = AnimationUtils.loadLayoutAnimation(this, resId);
rv_1.setLayoutAnimation(animation);
其次是左右拖拽的效果
實現接口ItemTouchHelper.Callback,這裏面的兩個方法分別是移動和側滑的時候調用
package com.example.administrator.testactivity.custom;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import com.example.administrator.testactivity.imple.ItemTouchMoveListener;
import java.util.Collections;
import java.util.List;
public class MyItemTouchCallBack extends ItemTouchHelper.Callback {
private ItemTouchMoveListener touchlistener;
private List<String> list;
public MyItemTouchCallBack(ItemTouchMoveListener touchlistener, List<String> list) {
this.touchlistener = touchlistener;
this.list = list;
}
//CallBack回調監聽時先調用,用來判斷當前是什麼動作 上下還是左右
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int flag = makeMovementFlags(dragFlag,swipeFlag);
return flag;
}
//當移動的時候回調的拖拽方法
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
if (viewHolder.getItemViewType()!= target.getItemViewType()){
return false;
}
touchlistener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
//當側滑的時候調用這個方法
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
touchlistener.onItemRemove(viewHolder.getAdapterPosition());
}
}
調用recycleview自身的相關屬性就可以了
//左右刪除拖拽的效果
helper = new ItemTouchHelper(new MyItemTouchCallBack(this,names));
helper.attachToRecyclerView(rv_1);
上下拖拽交換的效果
定義接口
public interface NofityItem {
void change_move(int form_position, int toPosition);
void change_remove(int position);
}
public interface ItemTouchMoveListener {
/**
* 當拖拽的時候回調
* @param fromPosition
* @param toPosition
* @return
*/
boolean onItemMove(int fromPosition, int toPosition);
/**
* 當條目被刪除的時候回調這個接口
* @param position
* @return
*/
boolean onItemRemove(int position);
}
在拖拽回調裏面,只要item存在拖拽就會執行下面的方法,在這裏面調用接口的裏面的方法,在activity中執行回調
//當移動的時候回調的拖拽方法
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
if (viewHolder.getItemViewType()!= target.getItemViewType()){
return false;
}
touchlistener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
//當側滑的時候調用這個方法
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
touchlistener.onItemRemove(viewHolder.getAdapterPosition());
}
activity中接收回調並刷新數據
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
Collections.swap(names, fromPosition, toPosition);
adapter.notifyItemMoved(fromPosition, toPosition);
return true;
}
@Override
public boolean onItemRemove(int position) {
names.remove(position);
adapter.notifyItemRemoved(position);
return true;
}