Android適配器之定義PagerAdapter萬能適配器


通常使用pageAdapter須要實現getcount、isViewFromObject、instantiateItem、destroyItem等默認函數,其實徹底能夠抽取共有代碼到父類當中。
/**
* Created by Xiaoxuan948 on 2015/10/27.
* Desc:
* 提示:先給adapter設置數據,再綁定適配器 setAdapter會調用instantiateItem方法
*/
public class AbsUnityBasePageAdapter<T> extends PagerAdapter implements INotifyAdapterDataSetChange {
private static final UtilsLog lg = UtilsLog.getLogger(AbsUnityBasePageAdapter.class.getSimpleName());
private LayoutInflater layoutInflater;

private IAdapterDataModifyHelper<T> IAdapterataModifyHelper;

public AbsUnityBasePageAdapter() {
this.IAdapterataModifyHelper = new DataModifyHelper<>();
}

public IAdapterDataModifyHelper<T> getDataModifyHelper() {
this.IAdapterataModifyHelper.setNotifyAdapterDataSetChange(this);
return IAdapterataModifyHelper;
}

@Override
public void notifyAdapter() {
lg.e("notifyAdapter with dataSize:" + this.IAdapterataModifyHelper.getDataResources().size());
notifyDataSetChanged();
}

/*PagerAdapter默認必須實現方法*/
@Override
public boolean isViewFromObject(View view, Object object) {
lg.e("isViewFromObject:" + (view == object ? "true" : "false"));
return view == object;
}


@Override
public int getCount() {
return IAdapterataModifyHelper.getDataResources().size();
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
if (layoutInflater == null) {
layoutInflater = LayoutInflater.from(container.getContext());
}
if (position >= IAdapterataModifyHelper.getDataResources().size()) {
lg.e("修正position:instantiateItem failed for position:" + position + " out of size:" + IAdapterataModifyHelper.getDataResources().size());
position = position % getDataModifyHelper().getDataResources().size();
}

lg.e("generateItemView for position:" + position);
View itemView = generateItemView(IAdapterataModifyHelper.getDataResources().get(position), layoutInflater, position);
container.addView(itemView);
return itemView;
}

@Override
//不調用會報錯
public void destroyItem(ViewGroup container, int position, Object object) {
lg.e("destroyItem:" + position);
container.removeView((View) object);
}

/*自定義的抽象方法:基於Position構建View對象*/
protected View generateItemView(T itemEntity, LayoutInflater layoutInflater, int position) {
if (itemEntity instanceof View) {
return (View) IAdapterataModifyHelper.getDataResources().get(position);
} else {
throw new NullPointerException("DataResource Type is not View,so child class must Override");
}
}
}
其中,IAdapterataModifyHelper當中封裝對數據的增刪改查等操做,而且已內部處理空指針異常。
instantiateItem中國,首先經過數組是否越界矯正position,調用generateItemView方法生成View對象並添加至container當中。在generateItemView實現當中,默認實現會判斷當前數據集是否爲View的集合,不然拋出異常,這裏主要是爲了強制開發人員重寫generateItemView根據itemEntity生成View對象。
業務層使用方式以下:
adapter = new AbsUnityBasePageAdapter<String>() {

@Override
protected View generateItemView(String itemEntity, LayoutInflater layoutInflater, int position) {
lg.e("ViewPagerLabBaseAdapter generateItemView with position :" + position);
View itemRootView = layoutInflater.inflate(R.layout.simple_item_vertical, null);
ViewFindHelper viewFindHelper = new ViewFindHelper(itemRootView);
ImageView imgItemCommon = viewFindHelper.generateView(R.id.imgItemCommon);
imgItemCommon.setScaleType(ImageView.ScaleType.CENTER_CROP);
Glide.with(layoutInflater.getContext()).load(itemEntity).into(imgItemCommon);
return itemRootView;
}
};

adapter.getDataModifyHelper().setDataResource(
"http://tupian.enterdesk.com/2013/mxy/12/10/15/3.jpg",
"http://pic1.nipic.com/2008-11-13/2008111384358912_2.jpg",
"http://img4.imgtn.bdimg.com/it/u=1249974208,2325623016&fm=21&gp=0.jpg",
"http://img0.imgtn.bdimg.com/it/u=1918423052,1540132432&fm=21&gp=0.jpg");
vpActViewPager.setAdapter(adapter);





相關文章
相關標籤/搜索