diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index c57a293..e6e5bf5 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -3,8 +3,9 @@
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 5d19981..5dd9f1d 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,5 +1,12 @@
+
+
+
+
+
+
+
diff --git a/app/app.iml b/app/app.iml
index 14e16ed..13fcf48 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -32,14 +32,16 @@
+
-
+
+
-
+
@@ -47,6 +49,7 @@
+
@@ -54,6 +57,7 @@
+
@@ -61,6 +65,7 @@
+
@@ -68,6 +73,7 @@
+
@@ -75,32 +81,42 @@
+
+
+
-
+
+
+
+
+
+
+
-
-
+
-
+
+
-
+
-
+
+
\ No newline at end of file
diff --git a/app/src/main/java/vienan/app/expandableswipelistview/ListAdapter.java b/app/src/main/java/vienan/app/expandableswipelistview/ListAdapter.java
new file mode 100644
index 0000000..07761aa
--- /dev/null
+++ b/app/src/main/java/vienan/app/expandableswipelistview/ListAdapter.java
@@ -0,0 +1,290 @@
+package vienan.app.expandableswipelistview;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseExpandableListAdapter;
+import android.widget.ExpandableListView;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.ditclear.swipelayout.SwipeDragLayout;
+
+import java.util.List;
+
+import vienan.app.expandableswipelistview.model.ChildEntity;
+import vienan.app.expandableswipelistview.model.GroupEntity;
+
+/**
+ * Created by vienan on 2015/9/17.
+ */
+public class ListAdapter extends BaseExpandableListAdapter implements SwipeDragLayout.ISwipeLayout {
+ private LayoutInflater inflater = null;
+ private List groupList;
+ private Context context;
+ private SwipeDragLayout mMenu;
+ private OnSwipeChildClickListener mOnSwipeChildClickListener;
+
+ /**
+ * 构造方法
+ *
+ * @param context
+ * @param group_list
+ */
+ public ListAdapter(Context context, List group_list) {
+ this.context = context;
+ this.groupList = group_list;
+ inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ }
+
+ /**
+ * 返回一级Item总数
+ */
+ @Override
+ public int getGroupCount() {
+ // TODO Auto-generated method stub
+ return groupList.size();
+ }
+
+ /**
+ * 返回二级Item总数
+ */
+ @Override
+ public int getChildrenCount(int groupPosition) {
+ if (groupList.get(groupPosition).getChildEntities() == null) {
+ return 0;
+ } else {
+ return groupList.get(groupPosition).getChildEntities().size();
+ }
+ }
+
+ /**
+ * 获取一级Item内容
+ */
+ @Override
+ public Object getGroup(int groupPosition) {
+ // TODO Auto-generated method stub
+ return groupList.get(groupPosition);
+ }
+
+ /**
+ * 获取二级Item内容
+ */
+ @Override
+ public ChildEntity getChild(int groupPosition, int childPosition) {
+ return groupList.get(groupPosition).getChildEntities().get(childPosition);
+ }
+
+ @Override
+ public long getGroupId(int groupPosition) {
+ // TODO Auto-generated method stub
+ return groupPosition;
+ }
+
+ @Override
+ public long getChildId(int groupPosition, int childPosition) {
+ // TODO Auto-generated method stub
+ return getCombinedChildId(groupPosition, childPosition);
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ @Override
+ public long getCombinedChildId(long groupId, long childId) {
+ return super.getCombinedChildId(groupId, childId);
+ }
+
+ @Override
+ public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
+ ViewGroup parent) {
+
+ GroupViewHolder holder = new GroupViewHolder();
+
+ if (convertView == null) {
+ convertView = inflater.inflate(R.layout.group_status_item, null);
+ }
+ holder.groupName = (TextView) convertView.findViewById(R.id.one_status_name);
+
+ holder.groupName.setText(groupList.get(groupPosition).getGroupName());
+
+ return convertView;
+ }
+
+ @Override
+ public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
+ View convertView, ViewGroup parent) {
+ ChildViewHolder viewHolder = null;
+ ChildEntity entity = getChild(groupPosition, childPosition);
+ Log.d("id", "" + groupPosition + "," + childPosition);
+ if (convertView == null) {
+ convertView = inflater.inflate(R.layout.child_status_item, null);
+ viewHolder = new ChildViewHolder();
+ viewHolder.childTitle = (TextView) convertView.findViewById(R.id.tv_title);
+ viewHolder.swipeLayout = (SwipeDragLayout) convertView.findViewById(R.id.sample);
+ viewHolder.iv_star = (ImageView) convertView.findViewById(R.id.star);
+ viewHolder.iv_trash = (ImageView) convertView.findViewById(R.id.trash);
+ viewHolder.swipeLayout.setISwipeLayout(this);
+ viewHolder.swipeLayout.setTag(entity);
+ convertView.setTag(viewHolder);
+ } else {
+ viewHolder = (ChildViewHolder) convertView.getTag();
+ }
+ if (entity != null) {
+ render(viewHolder, entity, groupPosition, childPosition, convertView, parent);
+ }
+
+ return convertView;
+ }
+
+ private void render(ChildViewHolder viewHolder, final ChildEntity entity, final int groupPosition,
+ final int childPosition, final View convertView, final ViewGroup parent) {
+ //必须是false,否则...
+ if (entity.isOpen) {
+ viewHolder.swipeLayout.smoothOpen(false);
+ } else {
+ viewHolder.swipeLayout.smoothClose(false);
+ }
+
+
+ viewHolder.swipeLayout.addListener(new SwipeDragLayout.SwipeListener() {
+ @Override
+ public void onStartOpen(SwipeDragLayout layout) {
+ toast("onStartOpen");
+ }
+
+ @Override
+ public void onStartClose(SwipeDragLayout layout) {
+ toast("onStartClose");
+ }
+
+ @Override
+ public void onUpdate(SwipeDragLayout layout, float offset) {
+ // toast("onUpdate");
+ }
+
+ @Override
+ public void onOpened(SwipeDragLayout layout) {
+ entity.isOpen = true;
+ }
+
+ @Override
+ public void onClosed(SwipeDragLayout layout) {
+ entity.isOpen = false;
+ }
+
+ @Override
+ public void onCancel(SwipeDragLayout layout) {
+ toast("onCancel");
+ }
+
+ @Override
+ public void onClick(SwipeDragLayout layout) {
+ // toast(entity.getChildTitle());
+ if (mOnSwipeChildClickListener != null) {
+ mOnSwipeChildClickListener.onChildClick((ExpandableListView) parent, convertView,
+ groupPosition, childPosition, getCombinedChildId(groupPosition, childPosition));
+ }
+ }
+ });
+
+ viewHolder.childTitle.setText(entity.getChildTitle());
+
+ viewHolder.iv_star.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ toast("click star");
+ // do something
+ }
+ });
+ viewHolder.iv_trash.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ toast("click trash");
+ // do something
+ }
+ });
+ }
+
+ @Override
+ public boolean isChildSelectable(int groupPosition, int childPosition) {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ /**
+ * 删除菜单打开信息接收
+ */
+ @Override
+ public void onMenuIsOpen(View view) {
+ mMenu = (SwipeDragLayout) view;
+ }
+
+ /**
+ * 滑动或者点击了Item监听
+ *
+ * @param slidingButtonView
+ */
+ @Override
+ public void onDownOrMove(SwipeDragLayout slidingButtonView) {
+ if (menuIsOpen()) {
+ if (mMenu != slidingButtonView && mMenu.isOpenStatus()) {
+ closeMenu();
+ }
+ }
+ }
+
+ /**
+ * 关闭菜单
+ */
+ public void closeMenu() {
+
+ mMenu.smoothClose(true);
+ ChildEntity child = (ChildEntity) mMenu.getTag();
+ child.isOpen = false;
+ mMenu = null;
+
+ }
+
+ /**
+ * 判断是否有菜单打开
+ */
+ public Boolean menuIsOpen() {
+ if (mMenu != null) {
+ return true;
+ }
+ return false;
+ }
+
+ private void toast(String msg) {
+ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
+ Log.d("msg", msg);
+ }
+
+ public void setOnSwipeChildClickListener(OnSwipeChildClickListener onSwipeChildClickListener) {
+ mOnSwipeChildClickListener = onSwipeChildClickListener;
+ }
+
+ public interface OnSwipeChildClickListener {
+ public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
+ int childPosition, long id);
+ }
+
+ static class GroupViewHolder {
+ TextView groupName;
+ }
+
+ static class ChildViewHolder {
+ public SwipeDragLayout swipeLayout;
+ public ImageView iv_star, iv_trash;
+ public TextView childTitle;
+
+ }
+}
diff --git a/app/src/main/java/vienan/app/expandableswipelistview/MyAdapter.java b/app/src/main/java/vienan/app/expandableswipelistview/MyAdapter.java
index 7de7ea6..2a4282c 100644
--- a/app/src/main/java/vienan/app/expandableswipelistview/MyAdapter.java
+++ b/app/src/main/java/vienan/app/expandableswipelistview/MyAdapter.java
@@ -155,12 +155,12 @@ private void render(ChildViewHolder viewHolder, final ChildEntity entity, final
viewHolder.swipeLayout.addListener(new SwipeDragLayout.SwipeListener() {
@Override
public void onStartOpen(SwipeDragLayout layout) {
- toast("onStartOpen");
+// toast("onStartOpen");
}
@Override
public void onStartClose(SwipeDragLayout layout) {
- toast("onStartClose");
+// toast("onStartClose");
}
@Override
@@ -182,7 +182,7 @@ public void onClosed(SwipeDragLayout layout) {
@Override
public void onCancel(SwipeDragLayout layout) {
- toast("onCancel");
+// toast("onCancel");
}
@Override
diff --git a/app/src/main/java/vienan/app/expandableswipelistview/RecyclerActivity.java b/app/src/main/java/vienan/app/expandableswipelistview/RecyclerActivity.java
new file mode 100644
index 0000000..8cb0878
--- /dev/null
+++ b/app/src/main/java/vienan/app/expandableswipelistview/RecyclerActivity.java
@@ -0,0 +1,107 @@
+package vienan.app.expandableswipelistview;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.AbsListView;
+import android.widget.ExpandableListView;
+import android.widget.Toast;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import vienan.app.expandableswipelistview.model.ChildEntity;
+import vienan.app.expandableswipelistview.model.GroupEntity;
+
+public class RecyclerActivity extends Activity {
+ private ExpandableListView expandableListView;
+ private List lists;
+ private ListAdapter adapter;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ initView();
+
+ }
+
+ private void initView() {
+ lists = initList();
+ adapter = new ListAdapter(this, lists);
+ expandableListView = (ExpandableListView) findViewById(R.id.expandableListView);
+ expandableListView.setOnTouchListener(new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ return adapter.menuIsOpen();
+ }
+ });
+ expandableListView.setOnScrollListener(new AbsListView.OnScrollListener() {
+ @Override
+ public void onScrollStateChanged(AbsListView view, int scrollState) {
+ if (scrollState!=SCROLL_STATE_IDLE){
+ if (adapter.menuIsOpen()){
+ adapter.closeMenu();
+ }
+ }
+ }
+
+ @Override
+ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+
+ }
+ });
+ expandableListView.setAdapter(adapter);
+ expandableListView.setGroupIndicator(null); // 去掉默认带的箭头
+ expandableListView.setSelection(0);// 设置默认选中项
+ // 遍历所有group,将所有项设置成默认展开
+ int groupCount = expandableListView.getCount();
+ for (int i = 0; i < groupCount; i++) {
+ expandableListView.expandGroup(i);
+ }
+ expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
+ @Override
+ public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
+ return true;
+ }
+ });
+
+ adapter.setOnSwipeChildClickListener(new ListAdapter.OnSwipeChildClickListener() {
+ @Override
+ public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
+ toast(childTimeArray[groupPosition][childPosition]);
+
+ return true;
+ }
+ });
+ }
+ //测试数据 8.23 one year
+ String[] groupArray = new String[]{"9月1日", "9月2日", "9月3日"};
+ String[][] childTimeArray = new String[][]{
+ {"测试数据1", "测试数据2", "测试数据3"},
+ {"测试数据4"}, {"测试数据5", "测试数据6","测试数据7", "测试数据8","测试数据9",
+ "测试数据10","测试数据11", "测试数据12"}};
+
+ private List initList() {
+
+ List groupList;
+
+ groupList = new ArrayList();
+ for (int i = 0; i < groupArray.length; i++) {
+ GroupEntity groupEntity = new GroupEntity(groupArray[i]);
+ List childList = new ArrayList();
+ for (int j = 0; j < childTimeArray[i].length; j++) {
+ ChildEntity childStatusEntity = new ChildEntity(childTimeArray[i][j]);
+ childList.add(childStatusEntity);
+ }
+ groupEntity.setChildEntities(childList);
+ groupList.add(groupEntity);
+ }
+ return groupList;
+ }
+
+ private void toast(String msg) {
+ Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
+
+ }
+}
diff --git a/app/src/main/java/vienan/app/expandableswipelistview/model/ChildEntity.java b/app/src/main/java/vienan/app/expandableswipelistview/model/ChildEntity.java
index 089a92e..668d503 100644
--- a/app/src/main/java/vienan/app/expandableswipelistview/model/ChildEntity.java
+++ b/app/src/main/java/vienan/app/expandableswipelistview/model/ChildEntity.java
@@ -16,4 +16,23 @@ public String getChildTitle() {
return childTitle;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ChildEntity that = (ChildEntity) o;
+
+ if (isOpen != that.isOpen) return false;
+ return childTitle.equals(that.childTitle);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = childTitle.hashCode();
+ result = 31 * result + (isOpen ? 1 : 0);
+ return result;
+ }
}
diff --git a/build.gradle b/build.gradle
index 9405f3f..573f4fd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.2.3'
+ classpath 'com.android.tools.build:gradle:2.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index a765ad2..71803e7 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Thu Sep 17 13:12:59 CST 2015
+#Wed Nov 02 20:48:26 CST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/swipelayout/src/main/java/com/ditclear/swipelayout/SwipeDragLayout.java b/swipelayout/src/main/java/com/ditclear/swipelayout/SwipeDragLayout.java
index 37ecd99..6487ba2 100644
--- a/swipelayout/src/main/java/com/ditclear/swipelayout/SwipeDragLayout.java
+++ b/swipelayout/src/main/java/com/ditclear/swipelayout/SwipeDragLayout.java
@@ -3,6 +3,7 @@
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Point;
+import android.support.v4.view.ViewCompat;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.util.Log;
@@ -59,9 +60,9 @@ private void init() {
mDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {
+
@Override
public boolean tryCaptureView(View child, int pointerId) {
-
return child == contentView;
}
@@ -83,6 +84,7 @@ public void onViewReleased(View releasedChild, float xvel, float yvel) {
mListener.onClosed(SwipeDragLayout.this);
}
+
}
} else {
close();
@@ -103,6 +105,14 @@ public void onViewReleased(View releasedChild, float xvel, float yvel) {
if (mListener != null) {
mListener.onOpened(SwipeDragLayout.this);
}
+ if (mISwipeLayout!=null){
+ mISwipeLayout.onMenuIsOpen(SwipeDragLayout.this);
+ }
+
+ }else{
+ if (mListener != null) {
+ mListener.onClick(SwipeDragLayout.this);
+ }
}
} else {
open();
@@ -110,6 +120,9 @@ public void onViewReleased(View releasedChild, float xvel, float yvel) {
if (mListener != null) {
mListener.onOpened(SwipeDragLayout.this);
}
+ if (mISwipeLayout!=null){
+ mISwipeLayout.onMenuIsOpen(SwipeDragLayout.this);
+ }
}
}
@@ -137,8 +150,6 @@ public void onViewPositionChanged(View changedView, int left, int top, int dx, i
final int childWidth = menuView.getWidth();
offset = -(float) (left - getPaddingLeft()) / childWidth;
//offset can callback here
- Log.d("offset", "" + offset + " dx" + dx);
- Log.d("isOpen", "" + isOpen);
dispatchSwipeEvent(offset);
}
@@ -156,14 +167,20 @@ private void dispatchSwipeEvent(float offset) {
mListener.onStartClose(this);
}
} else if (!isOpen() && offset <= touchFlop) {
+
if (mListener != null) {
mListener.onStartOpen(this);
}
+
} else {
if (mListener != null) {
mListener.onUpdate(this, offset);
}
}
+ }else if (offset
+
-
+
+
-
+
@@ -48,6 +50,7 @@
+
@@ -55,6 +58,7 @@
+
@@ -62,6 +66,7 @@
+
@@ -69,6 +74,7 @@
+
@@ -76,26 +82,29 @@
+
-
+
+
+
+
-
-
-
+
+
+
-