前言:
使用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) { //当用户的手被释放时。 } });
为自己总结,为下个你带给我点赞,( •̀ ω •́ )耶!