效果图:
在build.gradle文件中加入依赖:
compile 'com.android.support:recyclerview-v7:25.3.1'
使用RecyclerView和ItemTouchHelper可以非常方便的实现上图中的效果。
- 布局文件中加入RecyclerView
<?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="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
- item布局文件,一个TextView和一个ImageView
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item"
android:layout_width="match_parent"
android:layout_height="?listPreferredItemHeight"
android:clickable="true"
android:focusable="true">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="16dp"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ImageView
android:id="@+id/imageView"
android:layout_width="?listPreferredItemHeight"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|right"
android:scaleType="center"
android:src="@drawable/ic_menu_red_400_24dp" />
</FrameLayout>
- Adapter文件:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> mData;
public MyAdapter(List<String> data) {
this.mData = data;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.text.setText(mData.get(position));
}
@Override
public int getItemCount() {
return mData.size();
}
/**
* item移动后调用些方法更新
*
* @param fromPosition
* @param toPosition
*/
public void onItemMove(int fromPosition, int toPosition) {
Collections.swap(mData, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
}
/**
* 删除item调用此方法
*
* @param position
*/
public void onItemRemove(int position) {
mData.remove(position);
notifyItemRemoved(position);
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView text;
ImageView imageView;
public ViewHolder(View itemView) {
super(itemView);
text = (TextView) itemView.findViewById(R.id.text);
imageView = (ImageView) itemView.findViewById(R.id.imageView);
}
}
}
在重写父类的方法后,以添加了两个方法onItemMove和onItemRemove方法,在移动和删除的时候调用这两个方法,更新RecyclerView的数据显示。
- MainActivity代码
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyAdapter mAdapter;
private List<String> data = new ArrayList<>();
private ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
//返回一个复合标志,它定义了每个状态中启用的移动方向。
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
// | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
// int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
//item 移动回调,调用adapter的移动item更新方法
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
//item拖拽移除,调用adapter中删除item的方法
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
mAdapter.onItemRemove(viewHolder.getAdapterPosition());
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
initData();
// LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
// linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
// recyclerView.setLayoutManager(linearLayoutManager);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4);
recyclerView.setLayoutManager(gridLayoutManager);
mAdapter = new MyAdapter(data);
recyclerView.setAdapter(mAdapter);
//将ItemTouchHelper和RecyclerView绑定
mItemTouchHelper.attachToRecyclerView(recyclerView);
}
private void initData() {
for (int i = 0; i < 10; i++) {
data.add("One");
data.add("Two");
data.add("Three");
data.add("Four");
data.add("Five");
data.add("Six");
data.add("Sever");
data.add("Eight");
data.add("Nine");
data.add("Ten");
}
}
}