短视频系统,长按侧滑实现删除的按钮
短视频系统,长按侧滑实现删除的按钮实现的相关代码
1,导包
1 | implementation ‘com.android.support:recyclerview-v7: 27.1 . 1 ’ |
2,Xml文件
1 | <?xml version= "1.0" encoding= "utf-8" ?><br><android.support.constraint.ConstraintLayout<br>xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" <br>android:layout_height= "match_parent" ><br><android.support.v7.widget.RecyclerView<br> android:id= "@+id/rv_linear_list" <br> android:layout_width= "match_parent" <br> android:layout_height= "match_parent" <br> android:layout_marginTop= "20dp" /><br></android.support.constraint.ConstraintLayout> |
3,Activity
1 | public class RvItemTouchActivity extends AppCompatActivity {<br> private android.support.v7.widget.RecyclerView rvlinearlist;<br> private ArrayList<String> mData;<br> @Override <br> protected void onCreate( @Nullable Bundle savedInstanceState) {<br> super .onCreate(savedInstanceState);<br> setContentView(R.layout.activity_linear);<br> this .rvlinearlist = (RecyclerView) findViewById(R.id.rv_linear_list);<br> initData();<br> initAdapter();<br> }<br> private void initAdapter() {<br> //线性布局拖拽<br> rvlinearlist.setLayoutManager(new LinearLayoutManager(this));<br> //自定义类实现拖拽,侧滑删除<br> RvItemTouchAdapter adapter = new RvItemTouchAdapter(this, mData);<br> new ItemTouchHelper(new MyItemTouchHandler(adapter)).attachToRecyclerView(rvlinearlist);<br> rvlinearlist.setAdapter(adapter);<br> /* //库实现<br> RvItemTouchAdapter2 adapter2 = new RvItemTouchAdapter2(R.layout.item_rv_linear2, mData);<br> rvlinearlist.setAdapter(adapter2);<br> ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(adapter2);<br> ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);<br> itemTouchHelper.attachToRecyclerView(rvlinearlist);<br>// 开启拖拽<br> adapter2.enableDragItem(itemTouchHelper);<br> adapter2.setOnItemDragListener(onItemDragListener);<br>// 开启滑动删除<br> adapter2.enableSwipeItem();<br> adapter2.setOnItemSwipeListener(onItemSwipeListener);<br>*/<br> }<br> OnItemDragListener onItemDragListener = new OnItemDragListener() {<br> @Override<br> public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos){}<br> @Override<br> public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {<br> //移动位置互换<br> Collections.swap(mData,from,to);<br> }<br> @Override<br> public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {}<br> };<br> OnItemSwipeListener onItemSwipeListener = new OnItemSwipeListener() {<br> @Override<br> public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos) {<br> Log.e("MMM", "onItemSwipeStart: "+pos );<br> }<br> @Override<br> public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {<br> Log.e("MMM", "clearView: "+pos);<br> }<br> @Override<br> public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {<br> Log.e("MMM", "onItemSwiped: "+pos);<br> }<br> @Override<br> public void onItemSwipeMoving(Canvas canvas, RecyclerView.ViewHolder viewHolder, float dX, float dY, boolean isCurrentlyActive) {<br> //正在滑动监听<br> }<br> };<br> private void initData() {<br> mData = new ArrayList<>();<br> for (int i = 0; i < 10; i++) {<br> mData.add("频道"+i);<br> }<br> }<br>} |
4,Adapter
1 | public class RvItemTouchAdapter extends MyItemTouchHandler.ItemTouchAdapterImpl {<br> private final LayoutInflater mLayoutInflater;<br> private Context mContext;<br> private List<String>mData;<br> public RvItemTouchAdapter(Context context, List<String> data) {<br> mContext = context;<br> mData = data;<br> mLayoutInflater = LayoutInflater.from(context);<br> }<br> @Override <br> public void onItemMove( int fromPosition, int toPosition) {<br> //移动时交换位置<br> Collections.swap(mData,fromPosition,toPosition);<br> }<br> @Override<br> public void onItemRemove(int position) {<br> //移除监听<br> mData.remove(position);<br> }<br> @NonNull<br> @Override<br> public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {<br> View view = mLayoutInflater.inflate(R.layout.item_rv_linear2, parent, false);<br> return new ViewHolder(view);<br> }<br> @Override<br> public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {<br> if (holder instanceof ViewHolder) {<br> ((ViewHolder) holder).tvTv.setText(mData.get(position));<br> }<br> }<br> @Override<br> public int getItemCount() {<br> return mData.size();<br> }<br> class ViewHolder extends RecyclerView.ViewHolder {<br> TextView tvTv;<br> public ViewHolder(View itemView) {<br> super(itemView);<br> tvTv=itemView.findViewById(R.id.tv_item_rv_linear_text);<br> }<br> }<br>} |
5,MyItemTouchHandler
1 | public class MyItemTouchHandler extends ItemTouchHelper.Callback {<br> ItemTouchAdapterImpl adapter; <br> public MyItemTouchHandler( @NonNull ItemTouchAdapterImpl adapter) {<br> this .adapter = adapter; <br> } <br> /** <br> * 设置 允许拖拽和滑动删除的方向 <br> */ <br> @Override <br> public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {<br> // 指定可 拖拽方向 和 滑动消失的方向 <br> int dragFlags,swipeFlags; <br> RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); <br> if (manager instanceof GridLayoutManager || manager instanceof StaggeredGridLayoutManager) {<br> // 上下左右都可以拖动 <br> dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; <br> } else { <br> // 可以上下拖动 <br> dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; <br> } <br> // 可以左右方向滑动消失 <br> swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; <br> // 如果某个值传 0 , 表示不支持该功能 <br> return makeMovementFlags(dragFlags, swipeFlags); <br> } <br> /** <br> * 拖拽后回调,一般通过接口暴露给adapter, 让adapter去处理数据的交换 <br> */ <br> @Override <br> public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { <br> // 相同 viewType 之间才能拖动交换 <br> if (viewHolder.getItemViewType() == target.getItemViewType()) { <br> int fromPosition = viewHolder.getAdapterPosition();<br> int toPosition = target.getAdapterPosition();<br> if (fromPosition < toPosition) { <br> //途中所有的item位置都要移动 <br> for (int i = fromPosition; i < toPosition; i++) { <br> adapter.onItemMove(i, i + 1); <br> }<br> } else { <br> for (int i = fromPosition; i > toPosition; i--) { <br> adapter.onItemMove(i, i - 1); <br> }<br> }<br> adapter.notifyItemMoved(fromPosition, toPosition);<br> return true; <br> } <br> return false; <br> } <br> /** <br> * 滑动删除后回调,一般通过接口暴露给adapter, 让adapter去删除该条数据 <br> */ <br> @Override <br> public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { <br> // 删除数据 <br> adapter.onItemRemove(viewHolder.getAdapterPosition()); <br> // adapter 刷新 <br> adapter.notifyItemRemoved(viewHolder.getAdapterPosition()); <br> } <br> @Override <br> public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {<br> super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); <br> if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { <br> //滑动时改变Item的透明度 <br> final float alpha = 1 - Math.abs(dX) / (float)viewHolder.itemView.getWidth(); <br> viewHolder.itemView.setAlpha(alpha); <br> viewHolder.itemView.setTranslationX(dX); <br> } <br> } <br> /** <br> * item被选中(长按) <br> * 这里改变了 item的背景色, 也可以通过接口暴露, 让adapter去处理逻辑 <br> */ <br> @Override <br> public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { <br> if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { <br> // 拖拽状态 <br> viewHolder.itemView.setBackgroundColor(Color.BLUE);<br> }else if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { <br> // 滑动删除状态 <br> viewHolder.itemView.setBackgroundColor(Color.RED); <br> } <br> super.onSelectedChanged(viewHolder, actionState); <br> } <br> /** <br> * item取消选中(取消长按) <br> * 这里改变了 item的背景色, 也可以通过接口暴露, 让adapter去处理逻辑 <br> */ <br> @Override <br> public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { <br> viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT); <br> super.clearView(recyclerView, viewHolder); <br> } <br> /** <br> * 是否支持长按开始拖拽,默认开启 * 可以不开启,然后在长按 item 的时候,手动 调用 mItemTouchHelper.startDrag(myHolder) 开启,更加灵活 <br> */ <br> @Override <br> public boolean isLongPressDragEnabled() { <br> return adapter.autoOpenDrag(); <br> } <br> /** <br> * 是否支持滑动删除,默认开启 * 可以不开启,然后在长按 item 的时候,手动 调用 mItemTouchHelper.startSwipe(myHolder) 开启,更加灵活 <br> */ <br> @Override <br> public boolean isItemViewSwipeEnabled() { <br> return adapter.autoOpenSwipe(); <br> } <br> // 建议让 adapter 实现该接口 <br> public static abstract class ItemTouchAdapterImpl extends RecyclerView.Adapter{ <br> public abstract void onItemMove(int fromPosition, int toPosition); <br> public abstract void onItemRemove(int position); <br> // 是否自动开启拖拽 <br> protected boolean autoOpenDrag(){ <br> return true; <br> } <br> // 是否自动开启滑动删除 <br> protected boolean autoOpenSwipe(){ <br> return true; <br> } <br> }<br> } |
以上就是短视频系统,长按侧滑实现删除的按钮实现的相关代码, 更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现