滑动删除聊天记录

参考资料:Android 精彩编程200例


仿QQ滑动删除聊天记录

1. 实现过程

  • 在Gradle Scripts添加 recyclerview 的依赖implementation 'com.android.support:recyclerview-v7:27.1.1'
  • getScreeWith()获取手机屏幕宽度
   public static int getScreeWith(Context context){
//        获取窗口管理服务
       WindowManager ww = (WindowManager) >context.getSystemService(Context.WINDOW_SERVICE);
//        屏幕参数对象
       DisplayMetrics displayMetrics = new DisplayMetrics();
//        获取屏幕参数
       ww.getDefaultDisplay().getMetrics(displayMetrics);
//        返回屏幕宽度
       return displayMetrics.widthPixels;
   }
  • 创建 SlidingButtonView.java 类,用于实现自定义滑动“删除”按钮控件
public class SlidingButton extends HorizontalScrollView  {
    private TextView textView,ts;//删除按钮
    private int IScrollWid;//横向滚动
    private Boolean first = false; //标记第一次获取按钮
    private double fx = 0.0;

    public SlidingButton(Context context) {
        super(context,null );
    }

    public SlidingButton(Context context, AttributeSet attrs) {
        super(context, attrs,0);
    }

    public SlidingButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.setOverScrollMode(OVER_SCROLL_NEVER);      //设置滚动模式
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //第一次进入时获取删除按钮控件
        textView = findViewById(R.id.bt_delete);
        ts = findViewById(R.id.textview);
        first = true;       //修改标记
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
//        默认隐藏删除按钮
        if(changed){
            this.scrollTo(0,0);
//            获取水平滚动条的范围
            IScrollWid = textView.getWidth();
            Log.d("SlidingButton", "onLayout: "+ts.getWidth());
        }
    }

//    收拾判断
    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        switch (ev.getAction()){
            case MotionEvent.ACTION_UP:     //手指抬起
                changScrollx(Math.abs(ev.getX() - fx));
                break;
            case MotionEvent.ACTION_DOWN:// 手指按下
                fx = ev.getX();
                Log.d("SlidingButton", "onTouchEvent: "+fx);
                break;
        }
        return super.onTouchEvent(ev);
    }

    //判断是否显示删除按钮
    private void changScrollx(double route) {
//        触摸滑动的距离大于删除按钮宽度一半
        if( route >= (IScrollWid)){
            //显示删除按钮
            //scrollTo(IScrollWid,0);
            this.post(new Runnable() {//弹性滑动
                @Override
                public void run() {
                    smoothScrollTo(IScrollWid, 0);  
                }
            });

        }else{
            //scrollTo(0,0);
//            实现弹性滑动需要在handler中进行
            this.post(new Runnable() {
                @Override
                public void run() {
                    smoothScrollTo(0, 0);
                }
            });
        }
    }
}
  • recyclerview 的 Adapter
public class Aadapter extends RecyclerView.Adapter {

    private Context context;
    private List listString = new ArrayList<>();
    public Aadapter(Context context, List list){
        this.context = context;
        listString = list;
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout, parent, false);
        ViewHolder mViewH = new ViewHolder(view);
        return mViewH;
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
        holder.viewGroup.getLayoutParams().width = Utils.getScreeWith(context);
//        删除按钮单击事件
        holder.btn_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int n = holder.getLayoutPosition();     //获取行位置
                removeDate(n);          //删除指定的行
            }
        });
    }


    @Override
    public int getItemCount() {
        return listString.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{
        private ViewGroup viewGroup;
        private TextView btn_delete;
        public ViewHolder(View itemView) {
            super(itemView);
            btn_delete = itemView.findViewById(R.id.bt_delete);
            viewGroup = itemView.findViewById(R.id.layout_content);
        }
    }
//    删除列表行中信息的方法
    public void removeDate(int position){
        listString.remove(position);        //删除列表信息
        notifyItemRemoved(position);        //删除行
    }
  • item_layout


    
        
            
            
        


        
    




2. 结果:

image.png

注意:

  1. smoothScrollTo(): 有时候调用smoothScrollTo方法布局不会滚动,而scrollTo却可以,但我们又想要一种平滑的效果,可通过上述代码简单解决
  2. 测量过程中需要注意 padding
  3. android:overScrollMode="never" 去掉滚动条和滑动到边界阴影

你可能感兴趣的:(滑动删除聊天记录)