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 @@ + - + + + + - - - + + + -