在研究recycleview,发现非常强大,简单的实现个功能
功能需求
- 长按拖动,点击android图标拖动
- 左右滑动删除item
功能很简单都是一些api的东西。没有太多讲的。直接上代码好了。
先看主函数的类
package example.com.recycleviewanimation;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements onDragStartListener {
private List<String> mDatas;
private RecyclerView recycleView;
private ItemTouchHelper itemtouchhelper;
private WhAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
recycleView = (RecyclerView) findViewById(R.id.recycleView);//初始化
recycleView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));//定义样式
adapter = new WhAdapter(this, mDatas);//初始化adapter
recycleView.setAdapter(adapter);
ItemTouchHelper.Callback callback = new WhItemTouchCallback(adapter);//初始化ItemTouchHelper.
itemtouchhelper = new ItemTouchHelper(callback);
itemtouchhelper.attachToRecyclerView(recycleView);//这个必须加上.让辅助类和recycleview关联上
}
protected void initData() {//数据
mDatas = new ArrayList<String>();
for (int i = 'A'; i < 'z'; i++) {
mDatas.add("" + (char) i);
}
}
@Override
public void onStartDrag(RecyclerView.ViewHolder viewHolder) {//执行点击图标进行拖动的效果
itemtouchhelper.startDrag(viewHolder);
}
}
下面是adapter的方法
package example.com.recycleviewanimation;
import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Collections;
import java.util.List;
/**
* Created by wanghao on 16/5/11.
*/
public class WhAdapter extends RecyclerView.Adapter<WhAdapter.MyHolder>
implements ItemThouchHelperAdapterCallback {
private final onDragStartListener startdraglistener;
private List<String> mDatas;
private LayoutInflater mInflater;
public WhAdapter(Activity context, List<String> datas) {
mInflater = LayoutInflater.from(context);
mDatas = datas;
this.startdraglistener = (onDragStartListener) context;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyHolder holder = new MyHolder(mInflater.inflate(
R.layout.item_home, parent, false));
return holder;
}
@Override
public void onBindViewHolder(final MyHolder holder, final int position) {
holder.tv.setText(mDatas.get(position));
holder.iv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//这里面当点击图片的时候 开始执行拖动。因为itemtouchhelper的startDrag方法需要一个viewholder。所以通过回调的方法吧holder传出去
if (event.getAction() == MotionEvent.ACTION_DOWN) {
startdraglistener.onStartDrag(holder);
}
return false;
}
});
}
@Override
public int getItemCount() {
return mDatas.size();
}
class MyHolder extends RecyclerView.ViewHolder {
TextView tv;
ImageView iv;
public MyHolder(View view) {
super(view);
tv = (TextView) view.findViewById(R.id.id_num);
iv = (ImageView) view.findViewById(R.id.iv);
}
}
// 两个接口回调的方法.来执行 移动和 删除之后的操作
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
// 数据发生改变 两个数据交换位置
Collections.swap(mDatas, fromPosition, toPosition);
// 刷新数据
notifyItemMoved(fromPosition, toPosition);
return false;
}
@Override
public void onItemSwiped(int adapterPosition) {
// 1 删除集合positon中的而数据
mDatas.remove(adapterPosition);
// 2 刷新adapter
notifyItemRemoved(adapterPosition);
}
}
接口方法
package example.com.recycleviewanimation;
/**
* Created by wanghao on 16/5/11.
*/
public interface ItemThouchHelperAdapterCallback {
/**
* 拖拽会掉
*
* @param fromPosition
* @param toPosition
* @return
*/
boolean onItemMove(int fromPosition, int toPosition);
/**
* 侧滑删除
*
* @param adapterPosition
*/
void onItemSwiped(int adapterPosition);
}
//另一个回调
package example.com.recycleviewanimation;
import android.support.v7.widget.RecyclerView;
/**
* Created by wanghao on 16/5/11.
*/
public interface onDragStartListener {
public void onStartDrag(RecyclerView.ViewHolder viewHolder);
}
recycleview提供了一个非常给力的 辅助类
ItemTouchHelper。
package example.com.recycleviewanimation;
import android.graphics.Canvas;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
/**
* Created by wanghao on 16/5/11.
*/
public class WhItemTouchCallback extends ItemTouchHelper.Callback {
private final ItemThouchHelperAdapterCallback itemtouchcallback;
public WhItemTouchCallback(ItemThouchHelperAdapterCallback itemtouchcallback) {//动画的返回接口
this.itemtouchcallback = itemtouchcallback;
}
@Override
public boolean isLongPressDragEnabled() {//可以进行长按拖动
return true;
}
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}//进行侧滑拖动
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// callback监听那些动作?ItemTouchHelperItemTouchHelper--判断方向的
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//上下拖动
int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;//左右拖动
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
// 监听滑动(垂直方向)
itemtouchcallback.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// 滑动删除的动作的回调
itemtouchcallback.onItemSwiped(viewHolder.getAdapterPosition());
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {//侧滑状态
// 属性动画搞起来 侧滑是让item有个变小的动画 在这里可以进行你所有想做的动画效果
final float alpha = 1 - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
viewHolder.itemView.setAlpha(alpha);
viewHolder.itemView.setScaleX((float) Math.max(0.7, alpha));
viewHolder.itemView.setScaleY((float) Math.max(0.7, alpha));
if (alpha <=0) {//让属性动画回复原状
viewHolder.itemView.setAlpha(1);
viewHolder.itemView.setScaleX(1);
viewHolder.itemView.setScaleY(1);
}
}
else {//让属性动画回复原状
viewHolder.itemView.setAlpha(1);
viewHolder.itemView.setScaleX(1);
viewHolder.itemView.setScaleY(1);
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
private static final String TAG = "WhItemTouchCallback";
}
为了解耦 弄了些接口的东西。没什么特殊的
demo在这尼:https://github.com/wanghao200906/recycleviewanimation
尊重原创http://blog.csdn.net/wanghao200906/article/details/51394462