80,362
社区成员
发帖
与我相关
我的任务
分享
package ..
import ..
public class CatalogAdapter extends BaseAdapter {
private class ViewHolder {
TextView mTitle;
TextView mDescription;
Button mExpand;
}
private class Wrapper{
public View convertView = null;
public ViewHolder holder = null;
}
private ArrayList<CEBXOutlineElemWrapper> mItems = null;
private LayoutInflater mInflater = null;
// temporary variable used for listener set.
private int mTempPos = 0;
private CatalogOperator mCatalogOperator = null;
CatalogActivity mCatalogAtv = null;
public CatalogAdapter(Context context,CatalogActivity catalogAtv,CatalogOperator catalogOperator) {
mInflater = LayoutInflater.from(context);
mCatalogAtv = catalogAtv;
mCatalogOperator = catalogOperator;
if (catalogAtv == null || catalogOperator == null) {
Log.e("Error", "Input parameter error , null pointer in CatalogAdapter!");
}
}
/*
* set outline source of one level.
*/
public void setSource(ArrayList<CEBXOutlineElemWrapper> elems) {
mItems = elems;
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public Object getItem(int position) {
if (mItems.isEmpty()) {
Log.e("Error", "no items in CatalogAdapter.getItem!");
return null;
}
else {
if (position >= 0 && position < mItems.size()) {
return mItems.get(position);
} else {
Log.e("Error", "index out of bound in CatalogAdapter.getItem!");
return null;
}
}
}
@Override
public long getItemId(int position) {
return position;
}
private boolean canBeExpanded(int position) {
return false;
//mask for test , debug dead bug.
/* if (position < 0 || position >= mItems.size()) {
Log.e("Error", "Index out of bound in CatalogAdapter.canBeExpanded!");
throw new ArrayIndexOutOfBoundsException("error,my wrong understanding");
}
if (mItems.get(position) == null) {
Log.e("Error", "null object stored in mItems in CatalogAdapter!");
}
return CatalogOperator.canBeExpanded(mItems.get(position));*/
}
private void placementHelper(Wrapper wrapper,boolean canBeExpanded) {
if (wrapper == null) {
Log.e("Error","input error, null pointer !");
return;
}
if (wrapper.holder == null) {
wrapper.holder = new ViewHolder();
}
if (canBeExpanded) {
wrapper.convertView = mInflater.inflate(R.layout.custom_catalog_listitem_btn, null);
wrapper.holder.mTitle = (TextView)wrapper.convertView.findViewById(R.id.catalog_title1);
wrapper.holder.mDescription = (TextView)wrapper.convertView.findViewById(R.id.catalog_pagenum1);
wrapper.holder.mExpand = (Button)wrapper.convertView.findViewById(R.id.catalog_btn_expand);
} else {
wrapper.convertView = mInflater.inflate(R.layout.custom_catalog_listitem_no_btn, null);
wrapper.holder.mTitle = (TextView)wrapper.convertView.findViewById(R.id.catalog_title2);
wrapper.holder.mDescription = (TextView)wrapper.convertView.findViewById(R.id.catalog_pagenum2);
}
wrapper.convertView.setTag(wrapper.holder);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Calendar cal=Calendar.getInstance();
long startTime = cal.getTimeInMillis();
boolean canBeExpanded = false;//canBeExpanded(position);
ViewHolder holder = null;
if (convertView == null) {
Wrapper wrapper = new Wrapper();
wrapper.convertView = null;
wrapper.holder = null;
placementHelper(wrapper,canBeExpanded);
holder = wrapper.holder;
convertView = wrapper.convertView;
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
if (holder == null) {
Wrapper wrapper = new Wrapper();
wrapper.convertView = null;
wrapper.holder = null;
placementHelper(wrapper,canBeExpanded);
holder = wrapper.holder;
convertView = wrapper.convertView;
convertView.setTag(holder);
Log.w("Warning","getTag is null , in CatalogAdapter.getView");
}
if ((canBeExpanded && holder.mExpand == null)
|| (!canBeExpanded && holder.mExpand != null)) {// 不可复用的旧视图
Wrapper wrapper = new Wrapper();
wrapper.convertView = null;
wrapper.holder = holder;
placementHelper(wrapper,canBeExpanded);
holder = wrapper.holder;
convertView = wrapper.convertView;
convertView.setTag(holder);
Log.w("Warning","realloc view , not usable old view.");
}
}
// debug codes.
if (CatalogOperator.mShowDebuggingInfo) {
if (holder == null) {
Log.e("Error", "Holder is null");
}
if (holder.mTitle == null) {
Log.e("Error", "Holder.mTitle is null");
}
}
CEBXOutlineElemWrapper elem = mItems.get(position);
if(elem != null) {
holder.mTitle.setText("any");
/* String title = elem.GetTitle();
if (title != null) {
holder.mTitle.setText(title);
} else {
holder.mTitle.setText("未命名");
}*/
// whether this is a time-cost function ?
// setPageNum(holder,position);
} else {
Log.e("Error", "Program Error !");
}
mTempPos = position;
// setListenerForRow(convertView);
if (canBeExpanded) {
setListenerForExpandBtn(holder,position);
}
if (convertView == null || holder == null) {
Log.e("Error", "in CatalogAdapter.getView");
}
Log.i("Time : ", Long.toString(cal.getTimeInMillis() - startTime));
return convertView;
}
// set page number to holder for page showing
private void setPageNum(ViewHolder holder,int position) {
if (position < 0 || position >= mItems.size()) {
if (CatalogOperator.mShowDebuggingInfo) {
Log.e("Error", "Index out of bound in CatalogAdapter.setPageNum!");
}
}
if (!CatalogOperator.calCatalogDest(mItems.get(position))) {
if (CatalogOperator.mShowDebuggingInfo) {
Log.e("Error", "false returned by calCatalogDest in CatalogAdapter.setPageNum!");
}
return;
}
CxGotoDest dest = CatalogOperator.getCatalogDest();
if (dest == null) {
Log.e("Error", "null returned by kernel calling !");
}
holder.mDescription.setText("第"+ Long.toString(dest.pagenum) + "页");
}
/*
* 按下某目录项时的响应事件,假设用户是要打开此目录--定位图书,并返回到阅读界面。
* set listener for each row view.
*/
private void setListenerForRow(View convertView) {
convertView.setOnClickListener(new View.OnClickListener() {
private int mPos = mTempPos;
@Override
public void onClick(View v) {
mCatalogAtv.getReadyForCatalogOpen(mPos);
}
});
}
/*
* expand when the button is pressed.
*/
private void setListenerForExpandBtn(ViewHolder holder,int position) {
holder.mExpand.setOnClickListener(new View.OnClickListener() {
private int mPos = mTempPos;
@Override
public void onClick(View v) {
if (mPos < 0 || mPos >= mItems.size()) {
Log.e("Error","Program Error in CatalogAdapter");
return;
}
if (CatalogOperator.mShowDebuggingInfo) {
if (mItems.get(mPos) == null) {
Log.e("Error", "null pointer in setListenerForExpandBtn!");
}
}
mItems = mCatalogOperator.getChildren(mItems.get(mPos));
if (CatalogOperator.mShowDebuggingInfo) {
if (mItems == null) {
Log.e("Error", "mItems is null!");
}
}
notifyDataSetChanged();
if (CatalogOperator.mShowDebuggingInfo) {
Log.i("Info", "OK here");
}
}
});
}
}