美文网首页
滑动删除聊天记录

滑动删除聊天记录

作者: Yue_Q | 来源:发表于2018-10-28 12:17 被阅读0次

参考资料: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<Aadapter.ViewHolder> {

    private Context context;
    private List<String> listString = new ArrayList<>();
    public Aadapter(Context context, List<String> 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
<com.example.q9163.myandroid.view.SlidingButton xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_marginBottom="1dp"
    android:background="#ffffff">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <RelativeLayout
            android:id="@+id/layout_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_vertical">
            <ImageView
                android:id="@+id/img"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:background="@mipmap/ic_launcher"/>
            <TextView

                android:id="@+id/textview"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@+id/img"
                android:text="asdasdasasdas" />
        </RelativeLayout>


        <TextView
            android:id="@+id/bt_delete"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:background="#123654"
            android:layout_toRightOf="@+id/layout_content"
            android:text="删除" />
    </RelativeLayout>



</com.example.q9163.myandroid.view.SlidingButton>

2. 结果:

image.png

注意:

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

相关文章

网友评论

      本文标题:滑动删除聊天记录

      本文链接:https://www.haomeiwen.com/subject/jnuptqtx.html