之前想实现ListView右滑删除和上下拖拽交换位置的功能,但是找来找去,要么就实现上比较复杂,要么就是代码太老了。从github找了几个开源项目,但是总是有这样那样的bug。但是后来得知看到Google居然已经内置了这两个功能,只需要使用v7包里的RecycleView去实现就可以了。
代码如下
package justwen.demorecycleview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<Integer> mData = new ArrayList<>();
private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
public class MyViewHolder extends RecyclerView.ViewHolder{
public TextView mTextView;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.tv);
}
}
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_list_item,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {
holder.mTextView.setText(mData.get(position)+"");
}
@Override
public int getItemCount() {
return mData.size();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initViews();
}
private void initData(){
Collections.addAll(mData, new Integer[]{1,2,3,4,5,6,7,8,9,10});
}
private void initViews(){
mRecyclerView = (RecyclerView) findViewById(R.id.list);
// 设置布局管理器,默认是vertical布局
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
// 设置适配器
mRecyclerView.setAdapter(new MyAdapter());
// 重点,创建一个ItemTouchHelper类的对象,需要传入一个ItemTouchHelper的内部类Callbacl的对象,这里使用了Google内置的SimpleCallback
// 第一个参数是可以拖拽的方向,第二个参数是可以滑动的方向
ItemTouchHelper touchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
mRecyclerView.getAdapter().notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
Collections.swap(mData,viewHolder.getAdapterPosition(),target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
mData.remove(viewHolder.getAdapterPosition());
mRecyclerView.getAdapter().notifyDataSetChanged();
}
});
//将recycleView和ItemTouchHelper绑定
touchHelper.attachToRecyclerView(mRecyclerView);
}
}
上面我是直接用的Google写好的SimpleCallBack类,如果想自己判断回调上述两个方法的时机,可以使用Callback类重载getMoveMentFlags方法。
PS 我感觉RecycleView已经可以完全替代ListView, 不仅不用自己去实现ViewHolder了,Google还支持了很多的功能,自己写的app所有需要显示列表数据的地方都已经使用了RecycleView了。