要使用RecyclerView实现手势滑动选中相册图片的功能,你需要以下几个步骤:
创建含有图片资源的ViewHolder,继承自RecyclerView.ViewHolder,用于显示相册中的每个图片。
创建一个Adapter,继承自RecyclerView.Adapter,负责提供数据给ViewHolder。
在Adapter中创建一个内部类ViewHolder,用于实例化及绑定每个图片的视图。
实现ItemTouchHelper,它提供了滑动和拖放手势的回调接口。
在ItemTouchHelper的onMove方法中处理图片的交换逻辑。
图片适配器
public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> {private List<AlbumImage> imageList;private OnItemClickListener onItemClickListener;public ImageAdapter(List<AlbumImage> imageList) {this.imageList = imageList;}@NonNull@Overridepublic ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.album_image_item, parent, false);return new ImageViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {AlbumImage image = imageList.get(position);holder.bind(image);}@Overridepublic int getItemCount() {return imageList.size();}public class ImageViewHolder extends RecyclerView.ViewHolder {private ImageView imageView;public ImageViewHolder(@NonNull View itemView) {super(itemView);imageView = itemView.findViewById(R.id.imageView);}public void bind(AlbumImage image) {imageView.setImageResource(image.getImageResourceId());}}public interface OnItemClickListener {void onItemClick(AlbumImage image);}public void setOnItemClickListener(OnItemClickListener onItemClickListener) {this.onItemClickListener = onItemClickListener;}
}
相册图片实体类:
public class AlbumImage {private int imageResourceId;public AlbumImage(int imageResourceId) {this.imageResourceId = imageResourceId;}public int getImageResourceId() {return imageResourceId;}
}
布局文件:
<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent" />
主Activity:
public class MainActivity extends AppCompatActivity {RecyclerView recyclerView;ImageAdapter imageAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);recyclerView = findViewById(R.id.recyclerView);List<AlbumImage> imageList = new ArrayList<>();imageList.add(new AlbumImage(R.drawable.image1));imageList.add(new AlbumImage(R.drawable.image2));imageList.add(new AlbumImage(R.drawable.image3));imageAdapter = new ImageAdapter(imageList);recyclerView.setAdapter(imageAdapter);ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(imageAdapter));itemTouchHelper.attachToRecyclerView(recyclerView);imageAdapter.setOnItemClickListener(new ImageAdapter.OnItemClickListener() {@Overridepublic void onItemClick(AlbumImage image) {Toast.makeText(MainActivity.this, "Selected Image: " + image.getImageResourceId(), Toast.LENGTH_SHORT).show();}});}private static class ItemTouchHelperCallback extends ItemTouchHelper.Callback {private ImageAdapter adapter;ItemTouchHelperCallback(ImageAdapter adapter) {this.adapter = adapter;}@Overridepublic boolean isLongPressDragEnabled() {return true;}@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;return makeMovementFlags(dragFlags, swipeFlags);}@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {int fromPosition = viewHolder.getAdapterPosition();int toPosition = target.getAdapterPosition();if (fromPosition < toPosition) {for (int i = fromPosition; i < toPosition; i++) {Collections.swap(adapter.imageList, i, i + 1);}} else {for (int i = fromPosition; i > toPosition; i--) {Collections.swap(adapter.imageList, i, i - 1);}}adapter.notifyItemMoved(fromPosition, toPosition);return true;}@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {int position = viewHolder.getAdapterPosition();adapter.imageList.remove(position);adapter.notifyItemRemoved(position);}@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {viewHolder.itemView.getBackground().setColorFilter(Color.LTGRAY, PorterDuff.Mode.MULTIPLY);} else if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {viewHolder.itemView.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);} else {viewHolder.itemView.getBackground().clearColorFilter();}super.onSelectedChanged(viewHolder, actionState);}}
}
基本的实现流程:
1、创建了一个ImageAdapter,它包含一个AlbumImage的列表。在每个AlbumImage类中,我们有imageResourceId,它是图片的资源ID。ImageViewHolder类是RecyclerView.ViewHolder的一个内部类,它绑定每个图片视图。
2、ItemTouchHelperCallback类扩展了ItemTouchHelper.Callback,它处理滑动和拖动手势。在onMove方法中,我们交换了ImageAdapter中的AlbumImage对象,以确保视图反映底层数据的变化。在onSwiped方法中,我们从ImageAdapter的列表中移除项目并通知适配器。