package com.example.wechat01.widght.swipe.implments;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.view.View;
import android.widget.BaseAdapter;
import com.example.wechat01.widght.swipe.SimpleSwipeListener;
import com.example.wechat01.widght.swipe.SwipeLayout;
import com.example.wechat01.widght.swipe.interfaces.SwipeAdapterInterface;
import com.example.wechat01.widght.swipe.interfaces.SwipeItemMangerInterface;
/**
* SwipeItemMangerImpl is a helper class to help all the adapters to maintain
* open status.
*/
public class SwipeItemMangerImpl implements SwipeItemMangerInterface {
private Mode mode = Mode.Single;
public final int INVALID_POSITION = -1;
protected int mOpenPosition = INVALID_POSITION;
protected Set<Integer> mOpenPositions = new HashSet<Integer>();
protected Set<SwipeLayout> mShownLayouts = new HashSet<SwipeLayout>();
protected BaseAdapter mAdapter;
public SwipeItemMangerImpl(BaseAdapter adapter) {
if (adapter == null)
throw new IllegalArgumentException("Adapter can not be null");
if (!(adapter instanceof SwipeItemMangerInterface))
throw new IllegalArgumentException(
"adapter should implement the SwipeAdapterInterface");
this.mAdapter = adapter;
}
public enum Mode {
Single, Multiple
};
public Mode getMode() {
return mode;
}
public void setMode(Mode mode) {
this.mode = mode;
mOpenPositions.clear();
mShownLayouts.clear();
mOpenPosition = INVALID_POSITION;
}
public void initialize(View target, int position) {
int resId = getSwipeLayoutId(position);
OnLayoutListener onLayoutListener = new OnLayoutListener(position);
SwipeLayout swipeLayout = (SwipeLayout) target.findViewById(resId);
if (swipeLayout == null)
throw new IllegalStateException(
"can not find SwipeLayout in target view");
SwipeMemory swipeMemory = new SwipeMemory(position);
swipeLayout.addSwipeListener(swipeMemory);
swipeLayout.addOnLayoutListener(onLayoutListener);
swipeLayout.setTag(resId, new ValueBox(position, swipeMemory,
onLayoutListener));
mShownLayouts.add(swipeLayout);
}
public void updateConvertView(View target, int position) {
int resId = getSwipeLayoutId(position);
SwipeLayout swipeLayout = (SwipeLayout) target.findViewById(resId);
if (swipeLayout == null)
throw new IllegalStateException(
"can not find SwipeLayout in target view");
ValueBox valueBox = (ValueBox) swipeLayout.getTag(resId);
valueBox.swipeMemory.setPosition(position);
valueBox.onLayoutListener.setPosition(position);
valueBox.position = position;
}
private int getSwipeLayoutId(int position) {
return ((SwipeAdapterInterface) (mAdapter))
.getSwipeLayoutResourceId(position);
}
@Override
public void openItem(int position) {
if (mode == Mode.Multiple) {
if (!mOpenPositions.contains(position))
mOpenPositions.add(position);
} else {
mOpenPosition = position;
}
mAdapter.notifyDataSetChanged();
}
@Override
public void closeItem(int position) {
if (mode == Mode.Multiple) {
mOpenPositions.remove(position);
} else {
if (mOpenPosition == position)
mOpenPosition = INVALID_POSITION;
}
mAdapter.notifyDataSetChanged();
}
@Override
public void closeAllExcept(SwipeLayout layout) {
for (SwipeLayout s : mShownLayouts) {
if (s != layout)
s.close();
}
}
@Override
public void removeShownLayouts(SwipeLayout layout) {
mShownLayouts.remove(layout);
}
@Override
public List<Integer> getOpenItems() {
if (mode == Mode.Multiple) {
return new ArrayList<Integer>(mOpenPositions);
} else {
return Arrays.asList(mOpenPosition);
}
}
@Override
public List<SwipeLayout> getOpenLayouts() {
return new ArrayList<SwipeLayout>(mShownLayouts);
}
@Override
public boolean isOpen(int position) {
if (mode == Mode.Multiple) {
return mOpenPositions.contains(position);
} else {
return mOpenPosition == position;
}
}
class ValueBox {
OnLayoutListener onLayoutListener;
SwipeMemory swipeMemory;
int position;
ValueBox(int position, SwipeMemory swipeMemory,
OnLayoutListener onLayoutListener) {
this.swipeMemory = swipeMemory;
this.onLayoutListener = onLayoutListener;
this.position = position;
}
}
class OnLayoutListener implements SwipeLayout.OnLayout {
private int position;
OnLayoutListener(int position) {
this.position = position;
}
public void setPosition(int position) {
this.position = position;
}
@Override
public void onLayout(SwipeLayout v) {
if (isOpen(position)) {
v.open(false, false);
} else {
v.close(false, false);
}
}
}
class SwipeMemory extends SimpleSwipeListener {
private int position;
SwipeMemory(int position) {
this.position = position;
}
@Override
public void onClose(SwipeLayout layout) {
if (mode == Mode.Multiple) {
mOpenPositions.remove(position);
} else {
mOpenPosition = INVALID_POSITION;
}
}
@Override
public void onStartOpen(SwipeLayout layout) {
if (mode == Mode.Single) {
closeAllExcept(layout);
}
}
@Override
public void onOpen(SwipeLayout layout) {
if (mode == Mode.Multiple)
mOpenPositions.add(position);
else {
closeAllExcept(layout);
mOpenPosition = position;
}
}
public void setPosition(int position) {
this.position = position;
}
}
}