|
public abstract class BaseAllAdapters<T> extends BaseAdapter { |
|
|
|
protected Context mContext; |
|
protected LongSparseArray<DelegateAdapter> mDelegateAdapterSparseArray; |
|
private int mViewLayoutId = 0; |
|
private List<ListItem<T>> mItems; |
|
|
|
/*Constructor if we dont use mutiple view types in the list*/ |
|
public BaseAllAdapters(Context context, int viewLayoutId) { |
|
mContext = context; |
|
mViewLayoutId = viewLayoutId; |
|
} |
|
|
|
/*Constructor if we use the delegateAdapter to create multiple view types in the list*/ |
|
public BaseAllAdapters(Context context, LongSparseArray<DelegateAdapter> delegateAdapterSparseArray) { |
|
mContext = context; |
|
Preconditions.checkNotNull(delegateAdapterSparseArray,"mDelegateAdapterSparseArray cannot be null"); |
|
Preconditions.checkState(delegateAdapterSparseArray.size()!=0,"mDelegateAdapterSparseArray cannot be empty using a multiple view type adapter, If you dont want to specify muliple views, please use the \"BaseAllAdapters(Context context, int viewLayoutId)\" constructor."); |
|
} |
|
|
|
public void clear() { |
|
mItems.clear(); |
|
notifyDataSetChanged(); |
|
} |
|
|
|
public List<T> getItems() { |
|
List<T> listItems = new ArrayList<T>(); |
|
for (ListItem<T> listItem : mItems) { |
|
listItems.add(listItem.getItem()); |
|
} |
|
return listItems; |
|
} |
|
|
|
public void setItems(List<T> items) { |
|
List<ListItem<T>> listItems = Utils.createListItemList(items); |
|
if (!Objects.equal(items, mItems)) { |
|
mItems = listItems; |
|
notifyDataSetChanged(); |
|
} |
|
} |
|
|
|
@Override |
|
public int getCount() { |
|
return mItems != null ? mItems.size() : 0; |
|
} |
|
|
|
@Override |
|
public ListItem<T> getItem(int position) { |
|
return mItems.get(position); |
|
} |
|
|
|
@Override |
|
public long getItemId(int position) { |
|
return position; |
|
} |
|
i |
|
@Override |
|
public View getView(int position, View convertView, ViewGroup parent) { |
|
final ListItem<T> item = getItem(position); |
|
ViewHolder holder; |
|
if (convertView == null) { |
|
if (isMultipleViewAdapter()) { |
|
DelegateAdapter adapter = mDelegateAdapterSparseArray.get(getItemViewType(position)); |
|
convertView = adapter.getView(mContext, position, convertView, parent, LayoutInflater.from(mContext), getItem(position)); |
|
} else { |
|
convertView = LayoutInflater.from(mContext).inflate(mViewLayoutId, parent, false); |
|
} |
|
holder = getHolderInstance(convertView); |
|
if (holder == null) holder = new ViewHolder(convertView); |
|
convertView.setTag(holder); |
|
} else { |
|
holder = (ViewHolder) convertView.getTag(); |
|
} |
|
bindView(position, convertView, item, holder); |
|
return convertView; |
|
} |
|
|
|
private boolean isMultipleViewAdapter() { |
|
return getViewTypeCount() > 1; |
|
} |
|
|
|
protected abstract void bindView(int position, View convertView, ListItem<T> item, ViewHolder parentHolder); |
|
|
|
protected abstract ViewHolder getHolderInstance(View view); |
|
|
|
public static class ViewHolder { |
|
public ViewHolder(View view) { |
|
ButterKnife.inject(this, view); |
|
} |
|
} |
|
|
|
public static <T> List<ListItem<T>> createListItemList(final List<T> items) { |
|
ArrayList<ListItem<T>> listItems = new ArrayList<ListItem<T>>(items.size()); |
|
for (T item : items) { |
|
listItems.add(new ListItem<T>(item)); |
|
} |
|
return listItems; |
|
} |
|
} |