短视频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制作,实现消息列表的左滑删除或长按删除,更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(117)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示