短视频app制作,实现消息列表的左滑删除或长按删除

短视频app制作,实现消息列表的左滑删除或长按删除
首先布局就是一个RecyclerView

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

适配器什么的不多说,正常写就行

mRecyclerView = findViewById(R.id.recyclerview);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
myApr = new MyApr();
mRecyclerView.setAdapter(myApr);
mDatas = new ArrayList<>();//这里是数据 自己放我这里就不放了
//添加长按删除监听
myApr.setOnremoveListnner(new MyApr.OnremoveListnner() {
    
    
    @Override
    public void ondelect(final int i) {
    
    
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setMessage("确定删除?");
        builder.setTitle("提示");
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
    
    
            @Override
            public void onClick(DialogInterface dialog, int which) {
    
    
                mDatas.remove(i);
                //更新列表
                myApr.notifyDataSetChanged();
                Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_LONG).show();
            }
        });

        //添加AlertDialog.Builder对象的setNegativeButton()方法
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
    
    

            @Override
            public void onClick(DialogInterface dialog, int which) {
    
    

            }
        });

        builder.create().show();

    }
});
public static class MyApr extends RecyclerView.Adapter<VH> {
    
    
    //创建删除监听接口
    interface OnremoveListnner {
    
    
        void ondelect(int i);
    }

    private OnremoveListnner onremoveListnner;

    public void setOnremoveListnner(OnremoveListnner onremoveListnner) {
    
    
        this.onremoveListnner = onremoveListnner;
    }

    @Override
    public VH onCreateViewHolder(ViewGroup parent, int viewType) {
    
    
        return new VH(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycleview_item, parent, false));
    }

    @Override
    public void onBindViewHolder(final VH holder, final int position) {
    
    
    //show=展示的view  click=删除view 监听也和recyclerView的不一样
        holder.show.setText(mDatas.get(position));
        //恢复状态
        holder.recyclerViewItem.apply();
        holder.click.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View view) {
    
    
                mDatas.remove(position);
                //更新列表
                notifyDataSetChanged();
                Toast.makeText(holder.itemView.getContext(), "删除成功", Toast.LENGTH_LONG).show();
            }
        });
        //长按监听
        holder.show.setOnLongClickListener(new View.OnLongClickListener() {
    
    
            @Override
            public boolean onLongClick(View v) {
    
    
                if (onremoveListnner != null) {
    
    
                    //删除
                    onremoveListnner.ondelect(position);
                }
                return true;
            }
        });
    }

    @Override
    public int getItemCount() {
    
    
        return null == mDatas ? 0 : mDatas.size();
    }
}

左划删除我这里跟RecyclerView是没有关系的,布局最关键,跟item有关,父容器需要自定义HorizontalScrollView,自己创建一个类就行,属性可以自己修改

public class MyRecyclerViewItem extends HorizontalScrollView {
    
    


    public MyRecyclerViewItem(Context context) {
    
    
        super(context);
        init(context,null);
    }

    public MyRecyclerViewItem(Context context, AttributeSet attrs) {
    
    
        super(context, attrs);
        init(context, attrs);
    }

    public MyRecyclerViewItem(Context context, AttributeSet attrs, int defStyleAttr) {
    
    
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    public static final String TAG=MyRecyclerViewItem.class.getSimpleName();
    private boolean isLeft = true;//默认左边
    private int rightLayoutWidth;
    private int leftLayoutWidth;
    private int range;

    public void setRightLayoutWidth(int rightLayoutWidth) {
    
    
        this.rightLayoutWidth = rightLayoutWidth;
    }

    public void setLeftLayoutWidth(int leftLayoutWidth) {
    
    
        this.leftLayoutWidth = leftLayoutWidth;
    }

    public void setRange(int range) {
    
    
        this.range = range;
    }

    private void init(Context context, AttributeSet attrs) {
    
    
        leftLayoutWidth = getScreenSize(getContext()).widthPixels;// recyclerview 宽度
        rightLayoutWidth = dp2px(getContext(),200);// 右边布局的宽度
        range = dp2px(getContext(), 30);// 移动多少开始切换阈值
        if (attrs!=null){
    
    
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyRecyclerViewItem);
            int indexCount = typedArray.getIndexCount();
            for (int i = 0; i < indexCount; i++) {
    
    
                int index = typedArray.getIndex(i);
                if (index==R.styleable.MyRecyclerViewItem_left_width){
    
    
                    leftLayoutWidth = typedArray.getInteger(index, 0)==0? leftLayoutWidth : dp2px(context, typedArray.getInteger(index, 0));
                }
                if (index==R.styleable.MyRecyclerViewItem_right_width){
    
    
                    rightLayoutWidth = typedArray.getInteger(index, 0)==0? rightLayoutWidth : dp2px(context, typedArray.getInteger(index, 0));
                }
                if (index==R.styleable.MyRecyclerViewItem_move_range){
    
    
                    range = typedArray.getInteger(index, 0)==0? range : dp2px(context, typedArray.getInteger(index, 0));
                }
            }
            typedArray.recycle();
        }
    }

    //适配器 bind 方法中调用
    public void apply() {
    
    
        isLeft = true;
        changeLayout();
        scrollTo(0, 0);
    }

    private void changeLayout() {
    
    
        try {
    
    
            ViewGroup mainLayout= (ViewGroup) getChildAt(0);
            ViewGroup left= (ViewGroup) mainLayout.getChildAt(0);
            ViewGroup right= (ViewGroup) mainLayout.getChildAt(1);
            if (left.getMeasuredWidth()== leftLayoutWidth && right.getMeasuredWidth()==rightLayoutWidth){
    
    
                Log.i(TAG, "changeLayout: no change");
                return;
            }
            ViewGroup.LayoutParams layoutParams = left.getLayoutParams();
            layoutParams.width = leftLayoutWidth;
            left.setLayoutParams(layoutParams);
            ViewGroup.LayoutParams layoutParams2 = right.getLayoutParams();
            layoutParams2.width = rightLayoutWidth;
            left.setLayoutParams(layoutParams);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

    public static DisplayMetrics getScreenSize(Context context){
    
    
        DisplayMetrics dm = new DisplayMetrics();
        WindowManager windowManager=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(dm);
        return dm;
    }


    @Override
    public boolean onTouchEvent(MotionEvent ev) {
    
    
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
    
    
            Log.i(getClass().getSimpleName(), "down");
            return true;
        }
        if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {
    
    
            Log.i(getClass().getSimpleName(), "up");
            if (isLeft) {
    
    
                if (getScrollX() > range) {
    
    
                    isLeft = false;
                    smoothScrollTo(rightLayoutWidth, 0);
                } else {
    
    
                    smoothScrollTo(0, 0);
                }
            } else {
    
    
                if (getScrollX() < (rightLayoutWidth - range)) {
    
    
                    isLeft = true;
                    smoothScrollTo(0, 0);
                } else {
    
    
                    smoothScrollTo(rightLayoutWidth, 0);
                }
            }
            return true;
        }
        Log.i(getClass().getSimpleName(), "end");
        return super.onTouchEvent(ev);
    }


    public static int dp2px(Context context,float dpValue) {
    
    
        DisplayMetrics scale = context.getResources().getDisplayMetrics();
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, scale);
    }
}

以上就是 短视频app制作,实现消息列表的左滑删除或长按删除,更多内容欢迎关注之后的文章

猜你喜欢

转载自blog.csdn.net/yb1314111/article/details/125371927