以前一直认为支付宝中的gridview拖拽效果很牛逼,局限于当时不会使用RecyclerView,眼光一直在GridView上打转,各种自定义,可是效果都不理想,前几天开始接触RecyclerView,使我打开了一个新的方向。言归正传,进入正题。
项目中不会导入RecyclerView使用的jar包的人可以[点击这里](http://blog.csdn.net/a396901990/article/details/40153759)
//创建一个RecyclerView
private void initView() {
recyclerView = new RecyclerView(this);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
recyclerView.setLayoutParams(layoutParams);
recyclerView.setBackgroundDrawable(ContextCompat.getDrawable(this, android.R.color.white));
setContentView(recyclerView);
}
//适配Adapter
class MyAdapter extends RecyclerView.Adapter{
private Context ctx;
MyAdapter(Context ctx){
this.ctx = ctx;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(View.inflate(ctx, R.layout.item_fresco_icon_name, null));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ViewHolder holder1 = (ViewHolder) holder;
StringBuilder sb = new StringBuilder("ac_");
sb.append(position%6+1);
holder1.face.setImageResource(getResources().getIdentifier(sb.toString(), "mipmap", "包名"));
holder1.title.setText(datas.get(position));
}
@Override
public int getItemCount() {
return datas.size();
}
}
//xml item布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="120dp">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/face"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_centerHorizontal="true"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/mark_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/face"
android:textColor="@android:color/black"
android:textSize="16sp"
android:gravity="center_horizontal"/>
</RelativeLayout>
//对应xml的Adapter的ViewHolder
class ViewHolder extends RecyclerView.ViewHolder{
AppCompatImageView face;
TextView title;
public ViewHolder(View itemView) {
super(itemView);
face = (AppCompatImageView) itemView.findViewById(R.id.face);
title = (TextView) itemView.findViewById(R.id.mark_name);
}
}
下面再来给RecyclerView设置一下
private void initConainter() {
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new GridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false));
recyclerView.setAdapter(adapter = new MyAdapter(this));
new ItemTouchHelper(mCallback).attachToRecyclerView(recyclerView);
}
要想给RecyclerView实现gridview的布局拖动效果,最关键的是给添加一个ItemTouchHelper,代码如下:
这里写代码片
ItemTouchHelper.Callback mCallback = new ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT,//drag方向,长按振动后可以拖动
0//swip方向,实现滑动删除) {
/**
* @param recyclerView
* @param viewHolder 拖动的ViewHolder
* @param target 目标位置的ViewHolder
* @return
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();//得到拖动ViewHolder的position
int toPosition = target.getAdapterPosition();//得到目标ViewHolder的position
if (fromPosition < toPosition) {
//分别把中间所有的item的位置重新交换
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(datas, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(datas, i, i - 1);
}
}
adapter.notifyItemMoved(fromPosition, toPosition);
//返回true表示执行拖动
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();
datas.remove(position);
adapter.notifyItemRemoved(position);
}
};
这就是上面出现的mCallBack了
好啦,到这里就over了,就是一个简单的ItemTouchHelper.SimpleCallback实现