SwipeLayout 仿qq会话列表简单侧滑【删除,修改】

前言:

使用SwipeLayout的优点:

  • 1.无论是在RecyclerView,ListView,还是LinearLayout等,只要是ViewGroup用该控件都能实现侧滑。
  • 2.控件的手势滑动冲突已解决,不会出现嵌套到ScrollView等控件出现滑动不流畅的情况。
  • 3.控件使用简单,只需要在xml外套一层该控件就好了,秒接入。
  • 4.点击事件很方便,可根据自己所写布局ID进行设置。

在开始前咱们可以先看看实现出来的效果:

佳姝1:首先,我是使用的ListView所以我只添加了一行依赖,如过使用RecyclerView还需添加它的依赖。

implementation "com.daimajia.swipelayout:library:1.2.0@aar"
implementation 'com.android.support:recyclerview-v7:25.0.1'

 佳姝2:布局,(1)Activity中添加ListView 控件,(2)适配器中添加以下布局。

item_namelist.xml:

<?xml version="1.0" encoding="utf-8"?>
<com.daimajia.swipe.SwipeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/R.id.swipelayout"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:orientation="vertical"
    tools:context=".ui.activity.MainActivity">

    <LinearLayout
        android:id="@+id/hide_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv_look"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/ic_look_list" />

        <ImageView
            android:id="@+id/iv_edit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/ic_edit_list" />

        <ImageView
            android:id="@+id/iv_delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/ic_delete_list" />

    </LinearLayout>

    <!--以上需添加侧滑后所显示的布局,以下需添加适配器Item所显示内容的布局-->
    
    <LinearLayout
        android:id="@+id/show_content_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shadowbgcolor"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_flie_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingStart="20dp"
                android:text="灯影科技有限公司年会"
                android:textColor="@color/text_color_01"
                android:textSize="12sp" />

            <TextView
                android:id="@+id/tv_beacon_states"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="4dp"
                android:paddingStart="20dp"
                android:text="12.11 18:53"
                android:textColor="@color/text_color_01"
                android:textSize="12sp" />
        </LinearLayout>

        <ImageView
            android:id="@+id/img_template"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="15dp"
            android:src="@drawable/ic_personal_enter_img" />

    </LinearLayout>
</com.daimajia.swipe.SwipeLayout>

 佳姝3:已将CommonAdapter适配器ViewHolder及数据库,ShowAlertDilog封装好,之后都是在Activity进行所有操作(点击事件及显示)。

CommonAdapter适配器封装:

package com.dintech.nameplate.ui.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public abstract class CommonAdapter<T> extends BaseAdapter {

    protected LayoutInflater mInflater;
    protected Context mContext;
    protected List<T> mDatas;
    protected final int mItemLayoutId;
    private SetListener setListener;
    private GetPos getPos;

    public CommonAdapter(Context context, List<T> mDatas, int itemLayoutId) {
        this.mContext = context;
        this.mInflater = LayoutInflater.from(mContext);
        this.mDatas = mDatas;
        this.mItemLayoutId = itemLayoutId;
    }

    public CommonAdapter(Context context, int itemLayoutId) {
        this.mContext = context;
        this.mInflater = LayoutInflater.from(context);
        this.mItemLayoutId = itemLayoutId;
        this.mDatas = new ArrayList<>();
    }

    /**
     * 刷新数据
     */
    public void refreshDatas(List<T> datas) {
        mDatas.clear();
        if (datas != null && !datas.isEmpty()) {
            mDatas.addAll(datas);
        }
        notifyDataSetChanged();
    }

    /**
     * 清空数据
     */
    public void clearDatas() {
        mDatas.clear();
        notifyDataSetChanged();
    }

    /**
     * 添加数据
     *
     * @param datas
     */
    public void addMoreDatas(List<T> datas) {
        if (datas != null && !datas.isEmpty()) {
            mDatas.addAll(datas);
        }
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mDatas.size();
    }


    @Override
    public T getItem(int position) {
        return mDatas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = getViewHolder(position, convertView,
                parent);
        if (getPos != null) {
            getPos.getPos(position);
        }
        convert(viewHolder, getItem(position), position);
        if (setListener != null) {
            if (position == mDatas.size() - 1) {
                setListener.onLastPosition(viewHolder);
            } else {
                setListener.onOtherPosition(viewHolder);
            }
        }
        return viewHolder.getConvertView();
    }

    public void setListener(SetListener setListener) {
        this.setListener = setListener;
    }

    public abstract void convert(ViewHolder helper, T item, int position);

    public void addAll(Collection<? extends T> list) {
        mDatas.clear();
        mDatas.addAll(list);
        notifyDataSetChanged();
    }

    public void setGetPosListener(GetPos getPos) {
        this.getPos = getPos;
    }


    private ViewHolder getViewHolder(int position, View convertView,
                                     ViewGroup parent) {
        return ViewHolder.get(mContext, convertView, parent, mItemLayoutId,
                position);
    }

    public List<T> getList() {
        return mDatas;
    }

    public interface SetListener {
        void onLastPosition(ViewHolder viewHolder);

        void onOtherPosition(ViewHolder viewHolder);
    }

    public interface GetPos {
        void getPos(int pos);
    }
}

 ViewHolder:

package com.dintech.nameplate.ui.adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class ViewHolder {
    private final SparseArray<View> mViews;
    private int mPosition;
    private View mConvertView;

    private ViewHolder(Context context, ViewGroup parent, int layoutId,
                       int position) {
        this.mPosition = position;
        this.mViews = new SparseArray<View>();
        mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
                false);
        // setTag
        mConvertView.setTag(this);
    }

    /**
     * 拿到一个ViewHolder对象
     */
    public static ViewHolder get(Context context, View convertView,
                                 ViewGroup parent, int layoutId, int position) {
        if (convertView == null) {
            return new ViewHolder(context, parent, layoutId, position);
        }

        return (ViewHolder) convertView.getTag();
    }

    public View getConvertView() {
        return mConvertView;
    }

    /**
     * 通过控件的Id获取对于的控件,如果没有则加入views
     */
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }

    /**
     * 为TextView设置字符串
     */
    public ViewHolder setText(int viewId, CharSequence text) {
        TextView view = getView(viewId);
        if (view != null)
            view.setText(text);
        return this;
    }

    /**
     * 为TextView设置字符串,颜色
     */
    public ViewHolder setText(int viewId, CharSequence text, int resId) {
        TextView view = getView(viewId);
        view.setTextColor(resId);
        view.setText(text);
        return this;
    }

    /**
     * 为ImageView设置图片
     */
    public ViewHolder setImageResource(int viewId, int drawableId) {
        ImageView view = getView(viewId);
        view.setImageResource(drawableId);

        return this;
    }

    /**
     * 为ImageView设置图片
     */
    public ViewHolder setImageBitmap(int viewId, Bitmap bm) {
        ImageView view = getView(viewId);
        view.setImageBitmap(bm);
        return this;
    }

    public int getPosition() {
        return mPosition;
    }


    public void setVisible(int viewId, int visibility) {
        View view = getView(viewId);
        view.setVisibility(visibility);
    }
}

 NamelistDaoRepository 数据库封装:

package com.dintech.nameplate.model.repository;

import com.dintech.nameplate.model.db.Namelist;
import com.dintech.nameplate.model.db.Namelist_;
import com.dintech.nameplate.util.NullUtil;

import java.util.List;

import io.objectbox.Box;

public class NamelistDaoRepository implements DaoRepository<Namelist> {

    private static NamelistDaoRepository daoRepository;
    private final Box<Namelist> namelistBox;

    public static NamelistDaoRepository getDaoRepository() {
        if (daoRepository == null) {
            synchronized (NamelistDaoRepository.class) {
                if (daoRepository == null) daoRepository = new NamelistDaoRepository();
            }
        }
        return daoRepository;
    }

    private NamelistDaoRepository() {
        this.namelistBox = Factory.boxFor(Namelist.class);
    }

    @Override
    public Box<Namelist> getBox() {
        return this.namelistBox;
    }

    @Override
    public List<Namelist> getEntityList() {
        return namelistBox.getAll();
    }

    @Override
    public void put(Namelist... entitys) {
        for (Namelist namelist : entitys) {
            Namelist item = namelistBox.query().equal(Namelist_.name, namelist.getName()).build().findFirst();
            if (!NullUtil.checkNull(item)) {
                BossDaoRepository.getDaoRepository().remove(item.bosses);
                item.bosses.addAll(namelist.bosses);
                namelistBox.put(item);
            } else {
                namelistBox.attach(namelist);
                namelistBox.put(namelist);
            }
        }
    }

    public void put(Namelist namelist) {
        namelistBox.put(namelist);
    }

    @Override
    public void removeAll() {
        this.namelistBox.removeAll();
    }

    public void remove(long id) {
        this.namelistBox.remove(id);
    }

}

 Dilog:

package com.dintech.nameplate.base;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.widget.EditText;

import com.racofix.basic.mvp.LogicI;

import butterknife.ButterKnife;
import butterknife.Unbinder;

@SuppressLint("Registered")
public class BaseActivity<T extends LogicI> extends com.racofix.basic.mvp.BaseActivity<T> {

    private Unbinder unbinder;
    private AlertDialog.Builder localBuilder;
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (this.unbinder != null) this.unbinder.unbind();
    }

    @Override
    public void setContentView(int layoutResID) {
        super.setContentView(layoutResID);
        this.unbinder = ButterKnife.bind(this);
    }

    @Override
    public void startActivity(Intent intent) {
        super.startActivity(intent);
    }

    public void showAlertDilog(String title, String msg, EditText editText, String changingPositive,      DialogInterface.OnClickListener positive, String changeNegative, DialogInterface.OnClickListener negative) {
        if (localBuilder == null) {
            createDialog();
        }

        localBuilder.setPositiveButton(changingPositive, positive);
        localBuilder.setNegativeButton(changeNegative, negative);
        localBuilder.setView(editText);
        localBuilder.setTitle(title);
        localBuilder.setMessage(msg);
        localBuilder.create();
        localBuilder.show();

    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public void showProgressDialog(String title, String msg, int dialogInterfaceP, String btnMsgP, DialogInterface.OnClickListener onClickListenerP, int dialogInterfaceN, String btnMsgN, DialogInterface.OnClickListener onClickListenerN) {
        if (progressDialog == null) {
            createProgressDialog();
        }

        progressDialog.setButton(dialogInterfaceP, btnMsgP, onClickListenerP);
        progressDialog.setButton(dialogInterfaceN, btnMsgN, onClickListenerN);
        progressDialog.setTitle(title);
        progressDialog.setMessage(msg);
        progressDialog.create();
        progressDialog.show();

    }

    public void dismissProgressDialog() {
        progressDialog.dismiss();
    }

    private void createProgressDialog() {
        progressDialog = new ProgressDialog(this);
    }

    public void createDialog() {
        localBuilder = new AlertDialog.Builder(this);
    }
}

 佳姝4:在Activity内进行实例化适配器,点击事件等处理。

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_namelist);
    CommonAdapter<Namelist> adapter = new CommonAdapter<Namelist>(this, R.layout.item_namelist) {
        @Override
        public void convert(ViewHolder helper, Namelist item, int position) {
            helper.setText(R.id.tv_flie_name, item.getName());
            helper.setText(R.id.tv_beacon_states, DateUtil.stampToDate(item.getTimestamp()));
            look = helper.getView(R.id.iv_look);
            swipeLayout = helper.getView(R.id.R_id_swipelayout);         
            //设置侧拉的模式
            swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown);
            helper.setVisible(R.id.iv_look, templateArrs == null ? View.GONE : View.VISIBLE);
            swipeMenuOnClick(helper, position);
        }
    };
    namelistLv.setAdapter(adapter);
} 

swipeMenuOnClick(helper, position); 

private void swipeMenuOnClick(ViewHolder helper, int position) {
    //菜单viewButton条目点击事件
    look.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (templateArrs != null) {
                BossListActivity.startup(NameListActivity.this, adapter.getItem(position).getId());
            }
        }
    });

    helper.getView(R.id.iv_edit).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            editDilog(position);

        }
    });

    helper.getView(R.id.iv_delete).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            deleteDilog(position);

        }
    });
}

  deleteDilog(position); editDilog(position);

 

private void deleteDilog(int position) {
    showAlertDilog("删除名单", "确定删除该名单", null, "是", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (entityList != null && entityList.size() > 0) {
                entityList.remove(position);
                long id = adapter.getItem(position).getId();
                NamelistDaoRepository.getDaoRepository().remove(id);
                adapter.refreshDatas(entityList);

                Toast.makeText(NameListActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
            }
        }
    }, "否", null);
}

private void editDilog(int position) {
    EditText editText = new EditText(NameListActivity.this);

    showAlertDilog("修改名称", null, editText, "重试", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String toString = editText.getText().toString();
            Namelist item = adapter.getItem(position);
            item.setName(toString);
            NamelistDaoRepository.getDaoRepository().put(item);
            adapter.notifyDataSetChanged();
            Toast.makeText(NameListActivity.this, "修改成功", Toast.LENGTH_LONG).show();

        }
    }, "返回", null);
}

 佳姝5:更多点击事件。。。

//ListView 条目点击事件也可以防止滑回与点击事件冲突,当然也可以直接使用ButterKnife
swipeLayout.getSurfaceView().setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

    }
});

如果我们需要在侧滑的时候实现其他逻辑的话,我们可以添加侧滑监听: 

swipeLayout.addSwipeListener(new SwipeLayout.SwipeListener() {
    @Override
    public void onStartOpen(SwipeLayout layout) {

    }

    @Override
    public void onOpen(SwipeLayout layout) {
        //当BottomView完全显示时。

    }

    @Override
    public void onStartClose(SwipeLayout layout) {
        //当你在刷新时
    }

    @Override
    public void onClose(SwipeLayout layout) {
       //当SurfaceView完全覆盖BottomView时.

    }

    @Override
    public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) {

    }

    @Override
    public void onHandRelease(SwipeLayout layout, float xvel, float yvel) {
      //当用户的手被释放时。

    }
});

 为自己总结,为下个你带给我点赞,( •̀ ω •́ )耶!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佳姝

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值