package com.mm.android.deviceaddmodule.mobilecommon.widget.sticky.stickylistheaders; import android.content.Context; import android.database.DataSetObserver; import android.graphics.drawable.Drawable; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Checkable; import android.widget.ListAdapter; import java.util.ArrayList; import java.util.List; final class StickyListHeadersAdapterWrapper extends BaseAdapter implements StickyListHeadersAdapter { public interface OnHeaderClickListener{ public void onHeaderClick(View header, int itemPosition, long headerId); } private final List headerCache = new ArrayList<>(); private final Context context; private final StickyListHeadersAdapter delegate; private Drawable divider; private int dividerHeight; private DataSetObserver dataSetObserver = new DataSetObserver() { @Override public void onInvalidated() { headerCache.clear(); } }; private OnHeaderClickListener onHeaderClickListener; StickyListHeadersAdapterWrapper(Context context, StickyListHeadersAdapter delegate) { this.context = context; this.delegate = delegate; delegate.registerDataSetObserver(dataSetObserver); } void setDivider(Drawable divider) { this.divider = divider; } void setDividerHeight(int dividerHeight) { this.dividerHeight = dividerHeight; } @Override public boolean areAllItemsEnabled() { return delegate.areAllItemsEnabled(); } @Override public boolean isEnabled(int position) { return delegate.isEnabled(position); } @Override public void registerDataSetObserver(DataSetObserver observer) { delegate.registerDataSetObserver(observer); } @Override public void unregisterDataSetObserver(DataSetObserver observer) { delegate.unregisterDataSetObserver(observer); } @Override public int getCount() { return delegate.getCount(); } @Override public Object getItem(int position) { return delegate.getItem(position); } @Override public long getItemId(int position) { return delegate.getItemId(position); } @Override public boolean hasStableIds() { return delegate.hasStableIds(); } @Override public int getItemViewType(int position) { return delegate.getItemViewType(position); } @Override public int getViewTypeCount() { return delegate.getViewTypeCount(); } @Override public boolean isEmpty() { return delegate.isEmpty(); } /** * Will recycle header from {@link WrapperView} if it exists */ private void recycleHeaderIfExists(WrapperView wv) { View header = wv.header; if (header != null) { headerCache.add(header); } } /** * Get a header view. This optionally pulls a header from the supplied * {@link WrapperView} and will also recycle the divider if it exists. */ private View configureHeader(WrapperView wv, final int position) { View header = wv.header; header = delegate.getHeaderView(position, header, wv); if (header == null) { throw new NullPointerException("Header view must not be null."); } //if the header isn't clickable, the listselector will be drawn on top of the header header.setClickable(true); header.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(onHeaderClickListener != null){ long headerId = delegate.getHeaderId(position); onHeaderClickListener.onHeaderClick(v, position, headerId); } } }); return header; } /** Returns {@code true} if the previous position has the same header ID. */ private boolean previousPositionHasSameHeader(int position) { return position != 0 && delegate.getHeaderId(position) == delegate .getHeaderId(position - 1); } @Override public WrapperView getView(int position, View convertView, ViewGroup parent) { WrapperView wv = (convertView == null) ? new WrapperView(context) : (WrapperView) convertView; View item = delegate.getView(position, wv.item, wv); View header = null; if (previousPositionHasSameHeader(position)) { recycleHeaderIfExists(wv); } else { header = configureHeader(wv, position); } if((item instanceof Checkable) && !(wv instanceof CheckableWrapperView)) { // Need to create Checkable subclass of WrapperView for ListView to work correctly wv = new CheckableWrapperView(context); } else if(!(item instanceof Checkable) && (wv instanceof CheckableWrapperView)) { wv = new WrapperView(context); } wv.update(item, header, divider, dividerHeight); return wv; } public void setOnHeaderClickListener(OnHeaderClickListener onHeaderClickListener){ this.onHeaderClickListener = onHeaderClickListener; } @Override public boolean equals(Object o) { if(delegate == null){ return o == null; } return delegate.equals(o); } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { return ((BaseAdapter) delegate).getDropDownView(position, convertView, parent); } @Override public int hashCode() { return delegate.hashCode(); } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); ((BaseAdapter) delegate).notifyDataSetChanged(); } @Override public void notifyDataSetInvalidated() { ((BaseAdapter) delegate).notifyDataSetInvalidated(); } @Override public String toString() { return delegate.toString(); } @Override public View getHeaderView(int position, View convertView, ViewGroup parent) { return delegate.getHeaderView(position, convertView, parent); } @Override public long getHeaderId(int position) { return delegate.getHeaderId(position); } }