diff --git a/library/src/main/java/com/baoyz/swipemenulistview/SwipeMenuAdapter.java b/library/src/main/java/com/baoyz/swipemenulistview/SwipeMenuAdapter.java index 7c75956..3638900 100644 --- a/library/src/main/java/com/baoyz/swipemenulistview/SwipeMenuAdapter.java +++ b/library/src/main/java/com/baoyz/swipemenulistview/SwipeMenuAdapter.java @@ -22,10 +22,12 @@ public class SwipeMenuAdapter implements WrapperListAdapter, private ListAdapter mAdapter; private Context mContext; private SwipeMenuListView.OnMenuItemClickListener onMenuItemClickListener; + private int mPosition = -1; - public SwipeMenuAdapter(Context context, ListAdapter adapter) { + public SwipeMenuAdapter(Context context, ListAdapter adapter, int menuPosition) { mAdapter = adapter; mContext = context; + mPosition = menuPosition; } @Override @@ -46,8 +48,14 @@ public long getItemId(int position) { @Override public View getView(int position, View convertView, ViewGroup parent) { SwipeMenuLayout layout = null; + ViewGroup viewGroup = null; if (convertView == null) { View contentView = mAdapter.getView(position, convertView, parent); + viewGroup = (ViewGroup) contentView; + if (mPosition >= 0 && mPosition < viewGroup.getChildCount()) { + contentView = viewGroup.getChildAt(mPosition); + viewGroup.removeView(contentView); + } SwipeMenu menu = new SwipeMenu(mContext); menu.setViewType(getItemViewType(position)); createMenu(menu); @@ -59,18 +67,38 @@ public View getView(int position, View convertView, ViewGroup parent) { listView.getCloseInterpolator(), listView.getOpenInterpolator()); layout.setPosition(position); + if (mPosition >= 0) { + viewGroup.addView(layout); + } else { + viewGroup = layout; + } } else { - layout = (SwipeMenuLayout) convertView; - layout.closeMenu(); - layout.setPosition(position); - View view = mAdapter.getView(position, layout.getContentView(), - parent); + viewGroup = (ViewGroup) convertView; + if (convertView instanceof SwipeMenuLayout) { + layout = (SwipeMenuLayout)convertView; + } else { + for (int i = 0; i < viewGroup.getChildCount(); i++) { + View view = viewGroup.getChildAt(i); + if (view instanceof SwipeMenuLayout) { + layout = (SwipeMenuLayout)view; + break; + } + } + } + if (layout != null) { + layout.closeMenu(); + layout.setPosition(position); + mAdapter.getView(position, layout.getContentView(), parent); + } else { + // must ensure invoke mAdapter.getView() + mAdapter.getView(position, convertView, parent); + } } if (mAdapter instanceof BaseSwipListAdapter) { boolean swipEnable = (((BaseSwipListAdapter) mAdapter).getSwipEnableByPosition(position)); layout.setSwipEnable(swipEnable); } - return layout; + return viewGroup; } public void createMenu(SwipeMenu menu) { diff --git a/library/src/main/java/com/baoyz/swipemenulistview/SwipeMenuListView.java b/library/src/main/java/com/baoyz/swipemenulistview/SwipeMenuListView.java index 48aaea0..be45905 100644 --- a/library/src/main/java/com/baoyz/swipemenulistview/SwipeMenuListView.java +++ b/library/src/main/java/com/baoyz/swipemenulistview/SwipeMenuListView.java @@ -6,6 +6,7 @@ import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; import android.view.animation.Interpolator; import android.widget.ListAdapter; import android.widget.ListView; @@ -39,6 +40,8 @@ public class SwipeMenuListView extends ListView { private Interpolator mCloseInterpolator; private Interpolator mOpenInterpolator; + private int mPosition = -1; + public SwipeMenuListView(Context context) { super(context); init(); @@ -60,9 +63,13 @@ private void init() { mTouchState = TOUCH_STATE_NONE; } + public void setMenuPosition(int position) { + mPosition = position; + } + @Override public void setAdapter(ListAdapter adapter) { - super.setAdapter(new SwipeMenuAdapter(getContext(), adapter) { + super.setAdapter(new SwipeMenuAdapter(getContext(), adapter, mPosition) { @Override public void createMenu(SwipeMenu menu) { if (mMenuCreator != null) { @@ -114,7 +121,17 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { mTouchPosition = pointToPosition((int) ev.getX(), (int) ev.getY()); View view = getChildAt(mTouchPosition - getFirstVisiblePosition()); - //只在空的时候赋值 以免每次触摸都赋值,会有多个open状态 + if (!(view instanceof SwipeMenuLayout)) { + // find child for SwipeMenuLayout + ViewGroup viewGroup = (ViewGroup) view; + for (int i = 0; i < viewGroup.getChildCount(); i++) { + view = viewGroup.getChildAt(i); + if (view instanceof SwipeMenuLayout) { + break; + } + } + } + // 只在空的时候赋值 以免每次触摸都赋值,会有多个open状态 if (view instanceof SwipeMenuLayout) { //如果有打开了 就拦截. if (mTouchView != null && mTouchView.isOpen() && !inRangeOfView(mTouchView.getMenuView(), ev)) {