Merge pull request #145 from jivesoftware/master

Refactor SwipeItemManager code to decouple it from adapter converns
This commit is contained in:
代码家 2015-05-05 10:51:48 +08:00
commit cc6a322f74
12 changed files with 76 additions and 225 deletions

View File

@ -15,7 +15,6 @@ import com.daimajia.androidanimations.library.YoYo;
import com.daimajia.swipe.SimpleSwipeListener;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.adapters.RecyclerSwipeAdapter;
import com.daimajia.swipe.implments.SwipeItemRecyclerMangerImpl;
import com.daimajia.swipedemo.R;
import java.util.ArrayList;
@ -90,7 +89,7 @@ public class RecyclerViewAdapter extends RecyclerSwipeAdapter<RecyclerViewAdapte
});
viewHolder.textViewPos.setText((position + 1) + ".");
viewHolder.textViewData.setText(item);
mItemManger.bindView(viewHolder.itemView, position);
mItemManger.bind(viewHolder.itemView, position);
}
@Override

View File

@ -12,6 +12,6 @@ android {
dependencies {
compile 'com.android.support:recyclerview-v7:21.0.0'
compile 'com.android.support:support-v4:21.0.3'
compile 'com.android.support:support-v4:22.1.1'
}
apply from: './gradle-mvn-push.gradle'

View File

@ -6,7 +6,6 @@ import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.implments.SwipeItemAdapterMangerImpl;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
@ -14,9 +13,9 @@ import com.daimajia.swipe.util.Attributes;
import java.util.List;
public abstract class ArraySwipeAdapter<T> extends ArrayAdapter implements SwipeItemMangerInterface,SwipeAdapterInterface {
public abstract class ArraySwipeAdapter<T> extends ArrayAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {
private SwipeItemAdapterMangerImpl mItemManger = new SwipeItemAdapterMangerImpl(this);
private SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);
{}
public ArraySwipeAdapter(Context context, int resource) {
super(context, resource);
@ -42,15 +41,15 @@ public abstract class ArraySwipeAdapter<T> extends ArrayAdapter implements Swipe
super(context, resource, textViewResourceId, objects);
}
@Override
public void notifyDatasetChanged() {
super.notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
boolean convertViewIsNull = convertView == null;
View v = super.getView(position, convertView, parent);
if(convertViewIsNull){
mItemManger.initialize(v, position);
}else{
mItemManger.updateConvertView(v, position);
}
mItemManger.bind(v, position);
return v;
}

View File

@ -5,9 +5,8 @@ import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.implments.SwipeItemAdapterMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
import com.daimajia.swipe.util.Attributes;
@ -15,7 +14,7 @@ import java.util.List;
public abstract class BaseSwipeAdapter extends BaseAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {
protected SwipeItemAdapterMangerImpl mItemManger = new SwipeItemAdapterMangerImpl(this);
protected SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);
/**
* return the {@link com.daimajia.swipe.SwipeLayout} resource id, int the view item.
@ -42,16 +41,19 @@ public abstract class BaseSwipeAdapter extends BaseAdapter implements SwipeItemM
*/
public abstract void fillValues(int position, View convertView);
@Override
public void notifyDatasetChanged() {
super.notifyDataSetChanged();
}
@Override
public final View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if(v == null){
v = generateView(position, parent);
mItemManger.initialize(v, position);
}else{
mItemManger.updateConvertView(v, position);
}
mItemManger.bind(v, position);
fillValues(position, v);
return v;
}

View File

@ -7,9 +7,8 @@ import android.view.View;
import android.view.ViewGroup;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.implments.SwipeItemAdapterMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
import com.daimajia.swipe.util.Attributes;
@ -17,7 +16,7 @@ import java.util.List;
public abstract class CursorSwipeAdapter extends CursorAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {
private SwipeItemAdapterMangerImpl mItemManger = new SwipeItemAdapterMangerImpl(this);
private SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);
protected CursorSwipeAdapter(Context context, Cursor c, boolean autoRequery) {
super(context, c, autoRequery);
@ -29,13 +28,8 @@ public abstract class CursorSwipeAdapter extends CursorAdapter implements SwipeI
@Override
public View getView(int position, View convertView, ViewGroup parent) {
boolean convertViewIsNull = convertView == null;
View v = super.getView(position, convertView, parent);
if(convertViewIsNull){
mItemManger.initialize(v, position);
}else{
mItemManger.updateConvertView(v, position);
}
mItemManger.bind(v, position);
return v;
}
@ -54,6 +48,11 @@ public abstract class CursorSwipeAdapter extends CursorAdapter implements SwipeI
mItemManger.closeAllExcept(layout);
}
@Override
public void closeAllItems() {
mItemManger.closeAllItems();
}
@Override
public List<Integer> getOpenItems() {
return mItemManger.getOpenItems();

View File

@ -4,7 +4,7 @@ import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.implments.SwipeItemRecyclerMangerImpl;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
import com.daimajia.swipe.util.Attributes;
@ -13,7 +13,7 @@ import java.util.List;
public abstract class RecyclerSwipeAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> implements SwipeItemMangerInterface, SwipeAdapterInterface {
public SwipeItemRecyclerMangerImpl mItemManger = new SwipeItemRecyclerMangerImpl(this);
public SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);
@Override
public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
@ -21,6 +21,11 @@ public abstract class RecyclerSwipeAdapter<VH extends RecyclerView.ViewHolder> e
@Override
public abstract void onBindViewHolder(VH viewHolder, final int position);
@Override
public void notifyDatasetChanged() {
super.notifyDataSetChanged();
}
@Override
public void openItem(int position) {
mItemManger.openItem(position);

View File

@ -7,7 +7,6 @@ import android.view.View;
import android.view.ViewGroup;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.implments.SwipeItemAdapterMangerImpl;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
@ -17,7 +16,7 @@ import java.util.List;
public abstract class SimpleCursorSwipeAdapter extends SimpleCursorAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {
private SwipeItemAdapterMangerImpl mItemManger = new SwipeItemAdapterMangerImpl(this);
private SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);
protected SimpleCursorSwipeAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
super(context, layout, c, from, to, flags);
@ -29,13 +28,8 @@ public abstract class SimpleCursorSwipeAdapter extends SimpleCursorAdapter imple
@Override
public View getView(int position, View convertView, ViewGroup parent) {
boolean convertViewIsNull = convertView == null;
View v = super.getView(position, convertView, parent);
if(convertViewIsNull){
mItemManger.initialize(v, position);
}else{
mItemManger.updateConvertView(v, position);
}
mItemManger.bind(v, position);
return v;
}

View File

@ -1,66 +0,0 @@
package com.daimajia.swipe.implments;
import android.view.View;
import android.widget.BaseAdapter;
import com.daimajia.swipe.SimpleSwipeListener;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
import com.daimajia.swipe.util.Attributes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* SwipeItemMangerImpl is a helper class to help all the adapters to maintain open status.
*/
public class SwipeItemAdapterMangerImpl extends SwipeItemMangerImpl{
protected BaseAdapter mAdapter;
public SwipeItemAdapterMangerImpl(BaseAdapter adapter) {
super(adapter);
this.mAdapter = adapter;
}
@Override
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);
}
@Override
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;
}
@Override
public void bindView(View target, int position){
}
}

View File

@ -1,8 +1,6 @@
package com.daimajia.swipe.implments;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.BaseAdapter;
import com.daimajia.swipe.SimpleSwipeListener;
import com.daimajia.swipe.SwipeLayout;
@ -11,7 +9,7 @@ import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
import com.daimajia.swipe.util.Attributes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@ -19,7 +17,7 @@ import java.util.Set;
/**
* SwipeItemMangerImpl is a helper class to help all the adapters to maintain open status.
*/
public abstract class SwipeItemMangerImpl implements SwipeItemMangerInterface {
public class SwipeItemMangerImpl implements SwipeItemMangerInterface {
private Attributes.Mode mode = Attributes.Mode.Single;
public final int INVALID_POSITION = -1;
@ -29,27 +27,13 @@ public abstract class SwipeItemMangerImpl implements SwipeItemMangerInterface {
protected Set<Integer> mOpenPositions = new HashSet<Integer>();
protected Set<SwipeLayout> mShownLayouts = new HashSet<SwipeLayout>();
protected BaseAdapter mBaseAdapter;
protected RecyclerView.Adapter mRecyclerAdapter;
protected SwipeAdapterInterface swipeAdapterInterface;
public SwipeItemMangerImpl(BaseAdapter adapter) {
if (adapter == null)
throw new IllegalArgumentException("Adapter can not be null");
public SwipeItemMangerImpl(SwipeAdapterInterface swipeAdapterInterface) {
if (swipeAdapterInterface == null)
throw new IllegalArgumentException("SwipeAdapterInterface can not be null");
if (!(adapter instanceof SwipeItemMangerInterface))
throw new IllegalArgumentException("adapter should implement the SwipeAdapterInterface");
this.mBaseAdapter = adapter;
}
public SwipeItemMangerImpl(RecyclerView.Adapter 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.mRecyclerAdapter = adapter;
this.swipeAdapterInterface = swipeAdapterInterface;
}
public Attributes.Mode getMode() {
@ -63,21 +47,24 @@ public abstract class SwipeItemMangerImpl implements SwipeItemMangerInterface {
mOpenPosition = INVALID_POSITION;
}
/* initialize and updateConvertView used for AdapterManagerImpl */
public abstract void initialize(View target, int position);
public void bind(View view, int position) {
int resId = swipeAdapterInterface.getSwipeLayoutResourceId(position);
SwipeLayout swipeLayout = (SwipeLayout) view.findViewById(resId);
if (swipeLayout == null)
throw new IllegalStateException("can not find SwipeLayout in target view");
public abstract void updateConvertView(View target, int position);
/* bindView used for RecyclerViewManagerImpl */
public abstract void bindView(View target, int position);
public int getSwipeLayoutId(int position) {
if (mBaseAdapter != null) {
return ((SwipeAdapterInterface) (mBaseAdapter)).getSwipeLayoutResourceId(position);
} else if (mRecyclerAdapter != null) {
return ((SwipeAdapterInterface) (mRecyclerAdapter)).getSwipeLayoutResourceId(position);
if (swipeLayout.getTag(resId) == null) {
OnLayoutListener onLayoutListener = new OnLayoutListener(position);
SwipeMemory swipeMemory = new SwipeMemory(position);
swipeLayout.addSwipeListener(swipeMemory);
swipeLayout.addOnLayoutListener(onLayoutListener);
swipeLayout.setTag(resId, new ValueBox(position, swipeMemory, onLayoutListener));
mShownLayouts.add(swipeLayout);
} else {
return -1;
ValueBox valueBox = (ValueBox) swipeLayout.getTag(resId);
valueBox.swipeMemory.setPosition(position);
valueBox.onLayoutListener.setPosition(position);
valueBox.position = position;
}
}
@ -89,11 +76,7 @@ public abstract class SwipeItemMangerImpl implements SwipeItemMangerInterface {
} else {
mOpenPosition = position;
}
if (mBaseAdapter != null) {
mBaseAdapter.notifyDataSetChanged();
} else if (mRecyclerAdapter != null) {
mRecyclerAdapter.notifyDataSetChanged();
}
swipeAdapterInterface.notifyDatasetChanged();
}
@Override
@ -104,11 +87,7 @@ public abstract class SwipeItemMangerImpl implements SwipeItemMangerInterface {
if (mOpenPosition == position)
mOpenPosition = INVALID_POSITION;
}
if (mBaseAdapter != null) {
mBaseAdapter.notifyDataSetChanged();
} else if (mRecyclerAdapter != null) {
mRecyclerAdapter.notifyDataSetChanged();
}
swipeAdapterInterface.notifyDatasetChanged();
}
@Override
@ -141,7 +120,7 @@ public abstract class SwipeItemMangerImpl implements SwipeItemMangerInterface {
if (mode == Attributes.Mode.Multiple) {
return new ArrayList<Integer>(mOpenPositions);
} else {
return Arrays.asList(mOpenPosition);
return Collections.singletonList(mOpenPosition);
}
}

View File

@ -1,63 +0,0 @@
package com.daimajia.swipe.implments;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.daimajia.swipe.SimpleSwipeListener;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.interfaces.SwipeAdapterInterface;
import com.daimajia.swipe.interfaces.SwipeItemMangerInterface;
import com.daimajia.swipe.util.Attributes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* SwipeItemRecyclerMangerImpl is a helper class to help the RecyclerView to maintain open status.
*/
public class SwipeItemRecyclerMangerImpl extends SwipeItemMangerImpl{
protected RecyclerView.Adapter mAdapter;
public SwipeItemRecyclerMangerImpl(RecyclerView.Adapter adapter) {
super(adapter);
this.mAdapter = adapter;
}
@Override
public void bindView(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");
if (swipeLayout.getTag(resId) == null) {
SwipeMemory swipeMemory = new SwipeMemory(position);
swipeLayout.addSwipeListener(swipeMemory);
swipeLayout.addOnLayoutListener(onLayoutListener);
swipeLayout.setTag(resId, new ValueBox(position, swipeMemory, onLayoutListener));
mShownLayouts.add(swipeLayout);
} else {
ValueBox valueBox = (ValueBox) swipeLayout.getTag(resId);
valueBox.swipeMemory.setPosition(position);
valueBox.onLayoutListener.setPosition(position);
valueBox.position = position;
}
}
@Override
public void initialize(View target, int position) {
}
@Override
public void updateConvertView(View target, int position) {
}
}

View File

@ -1,5 +1,9 @@
package com.daimajia.swipe.interfaces;
public interface SwipeAdapterInterface {
public int getSwipeLayoutResourceId(int position);
int getSwipeLayoutResourceId(int position);
void notifyDatasetChanged();
}

View File

@ -1,30 +1,29 @@
package com.daimajia.swipe.interfaces;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.implments.SwipeItemMangerImpl;
import com.daimajia.swipe.util.Attributes;
import java.util.List;
public interface SwipeItemMangerInterface {
public void openItem(int position);
void openItem(int position);
public void closeItem(int position);
void closeItem(int position);
public void closeAllExcept(SwipeLayout layout);
void closeAllExcept(SwipeLayout layout);
public void closeAllItems();
void closeAllItems();
public List<Integer> getOpenItems();
List<Integer> getOpenItems();
public List<SwipeLayout> getOpenLayouts();
List<SwipeLayout> getOpenLayouts();
public void removeShownLayouts(SwipeLayout layout);
void removeShownLayouts(SwipeLayout layout);
public boolean isOpen(int position);
boolean isOpen(int position);
public Attributes.Mode getMode();
Attributes.Mode getMode();
public void setMode(Attributes.Mode mode);
void setMode(Attributes.Mode mode);
}