package com.banking.xc.utils;
import java.util.Map;
import java.util.WeakHashMap;
import android.R.integer;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.HeaderViewListAdapter;
import com.banking.xc.utils.HttpGroup.HttpGroupSetting;
/**
* 辅助Adapter持有各种View的引用<br/>
* <br/>
* 我们没有办法方便地重写AdapterView或其子类<br/>
* Adapter为了避免影响内存释放一般不持有view<br/>
* 但我们需要持有并做各种工作,因此产生了此类
*/
public class AdapterHelper {
/**
* 键:itemView<br/>
* 值:subViews(键:viewId、值:view)
*/
private Map<View, Map<Integer, View>> itemView_subViews_map = new WeakHashMap<View, Map<Integer, View>>();
private AdapterView<Adapter> adapterView;
private HttpGroup httpGroup;
/**
* 如果position所指ItemView不在可视范围则返回null
*/
public static Integer getItemViewIndex(int firstVisiblePosition, int childCount, int position) {
int index = position - firstVisiblePosition;
int count = childCount;
if (index >= 0 && index < count) {
return index;
}
return null;
}
/**
* 维护subView
*/
public void putSubViews(View itemView, Map<Integer, View> subViews) {
itemView_subViews_map.put(itemView, subViews);
}
/**
* 通过position得到itemView<br />
* 如果positionItem已经离开可视范围将返回null,注意处理
*/
public View getItemView(int position, boolean withOutHeaderViews) {
boolean b = withOutHeaderViews && adapterView.getAdapter() instanceof HeaderViewListAdapter;
ChildViewInfo childViewInfo = new ChildViewInfo(adapterView);
if (Log.D) {
Log.d(AdapterHelper.class.getName(), "getItemView() firstVisiblePosition -->> " + childViewInfo.firstVisiblePosition);
Log.d(AdapterHelper.class.getName(), "getItemView() childCount -->> " + childViewInfo.childCount);
Log.d(AdapterHelper.class.getName(), "getItemView() firstVisiblePositionWithOutHeaderViews -->> " + childViewInfo.firstVisiblePositionWithOutHeaderViews);
Log.d(AdapterHelper.class.getName(), "getItemView() childCountWithOutHeaderViews -->> " + childViewInfo.childCountWithOutHeaderViews);
}
int firstVisiblePosition = b ? childViewInfo.firstVisiblePositionWithOutHeaderViews : //
childViewInfo.firstVisiblePosition;
int childCount = b ? childViewInfo.childCountWithOutHeaderViews : //
childViewInfo.childCount;
Integer index = getItemViewIndex(firstVisiblePosition, childCount, position);
if (null != index) {
index = b ? index + childViewInfo.visibleHeaderViewsCount : index;
return adapterView.getChildAt(index);
}
return null;
}
/**
* 通过itemView得到subViews
*/
private Map<Integer, View> getSubViews(View itemView) {
return itemView_subViews_map.get(itemView);
}
/**
* 通过itemView和viewId得到具体subView
*/
public View getSubView(View itemView, int subViewId) {
if (Log.D) {
Log.d("Temp", "getSubViews itemView -->> " + itemView);
Log.d("Temp", "getSubViews(itemView) -->> " + getSubViews(itemView));
}
return getSubViews(itemView).get(subViewId);// TODO 空指针
}
public AdapterView<Adapter> getAdapterView() {
return adapterView;
}
public void setAdapterView(AdapterView<Adapter> adapterView) {
this.adapterView = adapterView;
}
public HttpGroup getImageHttpGroup() {
if (httpGroup == null) {
httpGroup = HttpGroupUtils.getHttpGroupaAsynPool(HttpGroupSetting.TYPE_IMAGE);
}
return httpGroup;
}
private static class ChildViewInfo {
private Integer firstVisiblePosition = null;
private Integer childCount = null;
private Integer headerViewsCount = null;
private Integer firstVisiblePositionWithOutHeaderViews = null;
private Integer childCountWithOutHeaderViews = null;
private Integer visibleHeaderViewsCount = null;
public ChildViewInfo(AdapterView<Adapter> adapterView) {
Adapter adapter = adapterView.getAdapter();
firstVisiblePosition = adapterView.getFirstVisiblePosition();
childCount = adapterView.getChildCount();
if (null != adapter && adapter instanceof HeaderViewListAdapter) {
headerViewsCount = ((HeaderViewListAdapter) adapter).getHeadersCount();
firstVisiblePositionWithOutHeaderViews = firstVisiblePosition - headerViewsCount;
if (firstVisiblePositionWithOutHeaderViews < 0) {
firstVisiblePositionWithOutHeaderViews = 0;
}
visibleHeaderViewsCount = headerViewsCount - firstVisiblePosition;
if (visibleHeaderViewsCount > 0) {
visibleHeaderViewsCount = Math.min(childCount, visibleHeaderViewsCount);
childCountWithOutHeaderViews = childCount - visibleHeaderViewsCount;
} else {
visibleHeaderViewsCount = 0;
childCountWithOutHeaderViews = childCount;
}
}
}
}
}