短视频app制作,实现消息列表的左滑删除或长按删除
短视频app制作,实现消息列表的左滑删除或长按删除
首先布局就是一个RecyclerView
1 | <br><androidx.recyclerview.widget.RecyclerView<br> android:id= "@+id/recyclerview" <br> android:layout_width= "match_parent" <br> android:layout_height= "match_parent" /> |
适配器什么的不多说,正常写就行
1 | <br>mRecyclerView = findViewById(R.id.recyclerview);<br>mRecyclerView.setLayoutManager( new LinearLayoutManager(this));<br>myApr = new MyApr();<br>mRecyclerView.setAdapter(myApr);<br>mDatas = new ArrayList<>(); //这里是数据 自己放我这里就不放了<br>//添加长按删除监听<br>myApr.setOnremoveListnner(new MyApr.OnremoveListnner() {<br> @Override<br> public void ondelect(final int i) {<br> AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);<br> builder.setMessage("确定删除?");<br> builder.setTitle("提示");<br> builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {<br> @Override<br> public void onClick(DialogInterface dialog, int which) {<br> mDatas.remove(i);<br> //更新列表<br> myApr.notifyDataSetChanged();<br> Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_LONG).show();<br> }<br> });<br> //添加AlertDialog.Builder对象的setNegativeButton()方法<br> builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {<br> @Override<br> public void onClick(DialogInterface dialog, int which) {<br> }<br> });<br> builder.create().show();<br> }<br>});<br>public static class MyApr extends RecyclerView.Adapter<VH> {<br> //创建删除监听接口<br> interface OnremoveListnner {<br> void ondelect(int i);<br> }<br> private OnremoveListnner onremoveListnner;<br> public void setOnremoveListnner(OnremoveListnner onremoveListnner) {<br> this.onremoveListnner = onremoveListnner;<br> }<br> @Override<br> public VH onCreateViewHolder(ViewGroup parent, int viewType) {<br> return new VH(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycleview_item, parent, false));<br> }<br> @Override<br> public void onBindViewHolder(final VH holder, final int position) {<br> //show=展示的view click=删除view 监听也和recyclerView的不一样<br> holder.show.setText(mDatas.get(position));<br> //恢复状态<br> holder.recyclerViewItem.apply();<br> holder.click.setOnClickListener(new View.OnClickListener() {<br> @Override<br> public void onClick(View view) {<br> mDatas.remove(position);<br> //更新列表<br> notifyDataSetChanged();<br> Toast.makeText(holder.itemView.getContext(), "删除成功", Toast.LENGTH_LONG).show();<br> }<br> });<br> //长按监听<br> holder.show.setOnLongClickListener(new View.OnLongClickListener() {<br> @Override<br> public boolean onLongClick(View v) {<br> if (onremoveListnner != null) {<br> //删除<br> onremoveListnner.ondelect(position);<br> }<br> return true;<br> }<br> });<br> }<br> @Override<br> public int getItemCount() {<br> return null == mDatas ? 0 : mDatas.size();<br> }<br>} |
左划删除我这里跟RecyclerView是没有关系的,布局最关键,跟item有关,父容器需要自定义HorizontalScrollView,自己创建一个类就行,属性可以自己修改
1 | <br> public class MyRecyclerViewItem extends HorizontalScrollView {<br> public MyRecyclerViewItem(Context context) {<br> super(context);<br> init(context,null);<br> }<br> public MyRecyclerViewItem(Context context, AttributeSet attrs) {<br> super(context, attrs);<br> init(context, attrs);<br> }<br> public MyRecyclerViewItem(Context context, AttributeSet attrs, int defStyleAttr) {<br> super(context, attrs, defStyleAttr);<br> init(context, attrs);<br> }<br> public static final String TAG=MyRecyclerViewItem. class .getSimpleName();<br> private boolean isLeft = true; //默认左边<br> private int rightLayoutWidth;<br> private int leftLayoutWidth;<br> private int range;<br> public void setRightLayoutWidth(int rightLayoutWidth) {<br> this.rightLayoutWidth = rightLayoutWidth;<br> }<br> public void setLeftLayoutWidth(int leftLayoutWidth) {<br> this.leftLayoutWidth = leftLayoutWidth;<br> }<br> public void setRange(int range) {<br> this.range = range;<br> }<br> private void init(Context context, AttributeSet attrs) {<br> leftLayoutWidth = getScreenSize(getContext()).widthPixels;// recyclerview 宽度<br> rightLayoutWidth = dp2px(getContext(),200);// 右边布局的宽度<br> range = dp2px(getContext(), 30);// 移动多少开始切换阈值<br> if (attrs!=null){<br> TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyRecyclerViewItem);<br> int indexCount = typedArray.getIndexCount();<br> for (int i = 0; i < indexCount; i++) {<br> int index = typedArray.getIndex(i);<br> if (index==R.styleable.MyRecyclerViewItem_left_width){<br> leftLayoutWidth = typedArray.getInteger(index, 0)==0? leftLayoutWidth : dp2px(context, typedArray.getInteger(index, 0));<br> }<br> if (index==R.styleable.MyRecyclerViewItem_right_width){<br> rightLayoutWidth = typedArray.getInteger(index, 0)==0? rightLayoutWidth : dp2px(context, typedArray.getInteger(index, 0));<br> }<br> if (index==R.styleable.MyRecyclerViewItem_move_range){<br> range = typedArray.getInteger(index, 0)==0? range : dp2px(context, typedArray.getInteger(index, 0));<br> }<br> }<br> typedArray.recycle();<br> }<br> }<br> //适配器 bind 方法中调用<br> public void apply() {<br> isLeft = true;<br> changeLayout();<br> scrollTo(0, 0);<br> }<br> private void changeLayout() {<br> try {<br> ViewGroup mainLayout= (ViewGroup) getChildAt(0);<br> ViewGroup left= (ViewGroup) mainLayout.getChildAt(0);<br> ViewGroup right= (ViewGroup) mainLayout.getChildAt(1);<br> if (left.getMeasuredWidth()== leftLayoutWidth && right.getMeasuredWidth()==rightLayoutWidth){<br> Log.i(TAG, "changeLayout: no change");<br> return;<br> }<br> ViewGroup.LayoutParams layoutParams = left.getLayoutParams();<br> layoutParams.width = leftLayoutWidth;<br> left.setLayoutParams(layoutParams);<br> ViewGroup.LayoutParams layoutParams2 = right.getLayoutParams();<br> layoutParams2.width = rightLayoutWidth;<br> left.setLayoutParams(layoutParams);<br> } catch (Exception e) {<br> e.printStackTrace();<br> }<br> }<br> public static DisplayMetrics getScreenSize(Context context){<br> DisplayMetrics dm = new DisplayMetrics();<br> WindowManager windowManager=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);<br> windowManager.getDefaultDisplay().getMetrics(dm);<br> return dm;<br> }<br> @Override<br> public boolean onTouchEvent(MotionEvent ev) {<br> if (ev.getAction() == MotionEvent.ACTION_DOWN) {<br> Log.i(getClass().getSimpleName(), "down");<br> return true;<br> }<br> if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {<br> Log.i(getClass().getSimpleName(), "up");<br> if (isLeft) {<br> if (getScrollX() > range) {<br> isLeft = false;<br> smoothScrollTo(rightLayoutWidth, 0);<br> } else {<br> smoothScrollTo(0, 0);<br> }<br> } else {<br> if (getScrollX() < (rightLayoutWidth - range)) {<br> isLeft = true;<br> smoothScrollTo(0, 0);<br> } else {<br> smoothScrollTo(rightLayoutWidth, 0);<br> }<br> }<br> return true;<br> }<br> Log.i(getClass().getSimpleName(), "end");<br> return super.onTouchEvent(ev);<br> }<br> public static int dp2px(Context context,float dpValue) {<br> DisplayMetrics scale = context.getResources().getDisplayMetrics();<br> return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, scale);<br> }<br>} |
以上就是 短视频app制作,实现消息列表的左滑删除或长按删除,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)