使用AndroidSwipeLayout可以实现android列表滑动删除的效果,github上地址是AndroidSwipeLayout
因项目需要,在ExpandablelistView中加入左滑删除效果,网上搜索到一篇文章比较合适 ExpandableListView左滑删除
项目中实现的效果图
实现
1.首先在总布局中加入ExpandableListView,
<ExpandableListView
android:id="@+id/elvFurnitureList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:dividerHeight="0dp"
android:divider="@null"/>
2.设计group布局,一个TextView,布局不写了
3.设计child布局,主要思想就是将child的布局换为swipelayout,然后在adpter中设置click事件。
<?xml version="1.0" encoding="utf-8"?>
<com.daimajia.swipe.SwipeLayout android:id="@+id/swipe"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:clickToClose="true">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical"
android:tag="Bottom2"
>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#80d2d2d2"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_weight="1"
android:orientation="horizontal"
>
<LinearLayout
android:id="@+id/llEdit"
android:layout_width="75dp"
android:layout_height="match_parent"
android:gravity="center"
android:padding="5dp">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@drawable/shape_solid_blue_bg2"
android:gravity="center"
android:text="编辑"
android:textColor="@color/white"/>
</LinearLayout>
<LinearLayout
android:id="@+id/llUnbind"
android:layout_width="75dp"
android:layout_height="match_parent"
android:gravity="center"
android:padding="5dp">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@drawable/shape_solid_red_bg"
android:gravity="center"
android:text="解绑"
android:textColor="@color/white"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical">
<LinearLayout
android:id="@+id/llChildContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#80d2d2d2"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="70dp"
android:gravity="center_vertical">
<ImageView
android:id="@+id/ivChildImage"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="69dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="30dp"
android:gravity="center_vertical">
<TextView
android:id="@+id/tvChildTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单联灯"
android:textColor="#888888"
android:textSize="14sp"/>
<TextView
android:id="@+id/tvIsOnline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="(在线)"
android:textColor="#128ce3"
android:textSize="14sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="30dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="备注:"
android:textColor="#888888"
android:textSize="14sp"/>
<TextView
android:id="@+id/tvComment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text=""
android:textColor="#888888"
android:textSize="14sp"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llChildButton"
android:layout_width="match_parent"
android:layout_height="60dp">
<TextView
android:id="@+id/tvAddNewDevice"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#21ad38"
android:gravity="center"
android:text="+添加新设备"
android:textColor="@color/white"/>
<TextView
android:id="@+id/tvSelectExistDevice"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#00a0e9"
android:gravity="center"
android:text="选择已有设备"
android:textColor="@color/white"/>
</LinearLayout>
</LinearLayout>
</com.daimajia.swipe.SwipeLayout>
注意先写 隐藏的那一层布局
相关的Adapter
public class FurnitureListAdapter extends BaseExpandableListAdapter{
private List<Furniture> furnitureList = new ArrayList<>();
private Context context;
private LayoutInflater inflater;
private SwipeLayout currentExpandedSwipeLayout;
public FurnitureListAdapter(Context context, List<Furniture> furnitureList) {
this.context = context;
this.furnitureList = furnitureList;
inflater = LayoutInflater.from(context);
}
public void setFurnitureList(List<Furniture> furnitureList) {
this.furnitureList = furnitureList;
L.e("FurnitureListAdapter furnitureList ===" + new Gson().toJson(furnitureList));
}
@Override
public int getGroupCount() {
return furnitureList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return furnitureList.get(groupPosition).getChildList().size();
}
@Override
public Object getGroup(int groupPosition) {
return furnitureList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return furnitureList.get(groupPosition).getChildList().get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupHolder groupHolder;
if(convertView == null) {
groupHolder = new GroupHolder();
convertView = inflater.inflate(R.layout.item_furniture_group, null);
groupHolder.tvGroupName = (TextView) convertView.findViewById(R.id.tvGroupName);
groupHolder.viewTop = convertView.findViewById(R.id.viewTop);
convertView.setTag(groupHolder);
} else {
groupHolder = (GroupHolder) convertView.getTag();
}
if(groupPosition == 0) {
groupHolder.viewTop.setVisibility(View.GONE);
} else {
groupHolder.viewTop.setVisibility(View.VISIBLE);
}
Furniture device = furnitureList.get(groupPosition);
groupHolder.tvGroupName.setText(device.getGroupTitle());
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildHolder childHolder;
if(convertView == null) {
childHolder = new ChildHolder();
convertView = inflater.inflate(R.layout.item_furniture_child, null);
childHolder.ivChildImage = (ImageView) convertView.findViewById(R.id.ivChildImage);
childHolder.tvChildTitle = (TextView) convertView.findViewById(R.id.tvChildTitle);
childHolder.tvIsOnline = (TextView) convertView.findViewById(R.id.tvIsOnline);
childHolder.tvComment = (TextView) convertView.findViewById(R.id.tvComment);
childHolder.tvAddNewDevice = (TextView) convertView.findViewById(R.id.tvAddNewDevice);
childHolder.tvSelectExistDevice = (TextView) convertView.findViewById(R.id.tvSelectExistDevice);
childHolder.llChildContent = (LinearLayout) convertView.findViewById(R.id.llChildContent);
childHolder.llChildButton = (LinearLayout) convertView.findViewById(R.id.llChildButton);
childHolder.llEdit = (LinearLayout) convertView.findViewById(R.id.llEdit);
childHolder.llUnbind = (LinearLayout) convertView.findViewById(R.id.llUnbind);
//滑动
childHolder.mSwipeLayout = (SwipeLayout) convertView.findViewById(R.id.swipe);
childHolder.mSwipeLayout.setShowMode(SwipeLayout.ShowMode.PullOut);
childHolder.mSwipeLayout.addDrag(SwipeLayout.DragEdge.Right, childHolder.mSwipeLayout.findViewWithTag("Bottom2"));
convertView.setTag(childHolder);
} else {
childHolder = (ChildHolder) convertView.getTag();
}
final FurnitureChild child = furnitureList.get(groupPosition).getChildList().get(childPosition);
if (child.isData()) {
childHolder.llChildContent.setVisibility(View.VISIBLE);
childHolder.llChildButton.setVisibility(View.GONE);
childHolder.ivChildImage.setImageResource(child.getResId());
childHolder.tvChildTitle.setText(child.getChildTitle());
childHolder.tvComment.setText(child.getComment());
if(child.isOnline()) {
childHolder.tvIsOnline.setTextColor(Color.parseColor("#128ce3"));
} else {
childHolder.tvIsOnline.setTextColor(Color.parseColor("#888888"));
}
childHolder.llEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
L.e("FurnitureListAdapter child llEdit===" + new Gson().toJson(child));
FurnitureListActivity.instance.editDevice(child.getAreaId(), child.getAreaName(), child.getDevice());
}
});
childHolder.llUnbind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
L.e("FurnitureListAdapter child llUnbind===" + new Gson().toJson(child));
FurnitureListActivity.instance.dismissDevice(child.getDevice());
}
});
} else {
childHolder.llChildContent.setVisibility(View.GONE);
childHolder.llChildButton.setVisibility(View.VISIBLE);
childHolder.tvAddNewDevice.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FurnitureListActivity.instance.addDevice(child.getAreaId(), child.getAreaName());
}
});
childHolder.tvSelectExistDevice.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// context.startActivity(new Intent(context, AlreadyHadDeviceActivity.class));
FurnitureListActivity.instance.selectExistDevice(child.getAreaId(), child.getAreaName());
}
});
}
childHolder.mSwipeLayout.addSwipeListener(new SwipeLayout.SwipeListener() {
@Override
public void onStartOpen(SwipeLayout layout) {
if (currentExpandedSwipeLayout != null&¤tExpandedSwipeLayout!=layout)
currentExpandedSwipeLayout.close(true);
}
@Override
public void onOpen(SwipeLayout layout) {
currentExpandedSwipeLayout = layout;
}
@Override
public void onStartClose(SwipeLayout layout) {
}
@Override
public void onClose(SwipeLayout layout) {
}
@Override
public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) {
}
@Override
public void onHandRelease(SwipeLayout layout, float xvel, float yvel) {
}
});
return convertView;
}
// public interface ClickResultListener{
// void ClickResult(int tag,int childPosition);
// }
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
class GroupHolder {
public TextView tvGroupName;
public View viewTop;
}
class ChildHolder {
public ImageView ivChildImage;
public TextView tvChildTitle;
public TextView tvIsOnline;
public TextView tvComment;
public TextView tvAddNewDevice;
public TextView tvSelectExistDevice;
public LinearLayout llChildContent;
public LinearLayout llChildButton;
public LinearLayout llEdit;
public LinearLayout llUnbind;
public SwipeLayout mSwipeLayout;
}
}
重点是关于 childHolder.mSwipeLayout的操作