android仿Adapter實(shí)現(xiàn)自定義PagerAdapter方法示例
PagerAdapter簡(jiǎn)介
PagerAdapter是android.support.v4包中的類,它的子類有FragmentPagerAdapter, FragmentStatePagerAdapter,這兩個(gè)adapter都是Fragment的適配器,用于實(shí)現(xiàn)Fragment的滑動(dòng)效果,這兩個(gè)adapter的使用和區(qū)別這次就先不介紹了,等下次有時(shí)間再做詳細(xì)的介紹。
PagerAdapter主要是viewpager的適配器,而viewPager則也是在android.support.v4擴(kuò)展包中新添加的一個(gè)強(qiáng)大的控件,可以實(shí)現(xiàn)控件的滑動(dòng)效果,比如咱們?cè)谲浖谐R?jiàn)的廣告欄的滑動(dòng)效果,用viewPager就可以實(shí)現(xiàn)。今天主要介紹如何使用viewPagr并重寫(xiě)PagerAdapter實(shí)現(xiàn)常見(jiàn)廣告欄的滑動(dòng)效果。
PagerAdapter用法簡(jiǎn)介
首先,如果繼承pageradapter,至少必須重寫(xiě)下面的四個(gè)方法
1. instantiateItem(ViewGroup, int)
2. destroyItem(ViewGroup, int, Object)
3. getCount()
4. isViewFromObject(View, Object)
下面我們以代碼的形式,說(shuō)明這四個(gè)方法的含義以及如何使用
private class ViewPagerAdapter extends PagerAdapter {
// 獲取要滑動(dòng)的控件的數(shù)量,在這里我們以滑動(dòng)的廣告欄為例,那么這里就應(yīng)該是展示的廣告圖片的ImageView數(shù)量
@Override
public int getCount() {
return images.size();
}
// 來(lái)判斷顯示的是否是同一張圖片,這里我們將兩個(gè)參數(shù)相比較返回即可
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
// PagerAdapter只緩存三張要顯示的圖片,如果滑動(dòng)的圖片超出了緩存的范圍,就會(huì)調(diào)用這個(gè)方法,將圖片銷毀
@Override
public void destroyItem(ViewGroup view, int position, Object object) {
view.removeView(images.get(position));
}
// 當(dāng)要顯示的圖片可以進(jìn)行緩存的時(shí)候,會(huì)調(diào)用這個(gè)方法進(jìn)行顯示圖片的初始化,我們將要顯示的ImageView加入到ViewGroup中,然后作為返回值返回即可
@Override
public Object instantiateItem(ViewGroup view, int position) {
view.addView(images.get(position));
return images.get(position);
}
}
實(shí)現(xiàn)了這四個(gè)方法,就可以實(shí)現(xiàn)滑動(dòng)的效果了。
android仿Adapter實(shí)現(xiàn)自定義PagerAdapter
最近在開(kāi)發(fā)中,為增加PagerAdapter的可用性與可讀性,自定義了一下PagerAdapter
public abstract class EjBasePagerAdapter<T> extends PagerAdapter {
protected List<T> list;
protected SparseArray<EjBasePagerHolder<T>> sparseArray;
public EjBasePagerAdapter(List<T> list){
this.list = list;
sparseArray = new SparseArray<>();
}
@Override
public int getCount() {
return list.size();
}
public String getIcon(int position){
return null;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
EjBasePagerHolder<T> holder = sparseArray.get(getSparsePosition(position));
if(null == holder){
holder = onBundHolder(container);
holder.setPosition(position);
holder.bindDada(list.get(position),position);
sparseArray.put(getSparsePosition(position),holder);
}
View view = holder.itemView;
container.addView(view);
return view;
}
@Override
public void notifyDataSetChanged() {
sparseArray.clear();
super.notifyDataSetChanged();
}
protected int getSparsePosition(int position){
return (position+10)*2;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
protected View inflate(int resorce, ViewGroup viewGroup) {
return LayoutInflater.from(viewGroup.getContext()).inflate(resorce, viewGroup, false);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
protected abstract EjBasePagerHolder<T> onBundHolder(ViewGroup container);
public void onDestroy(){
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
protected abstract class EjBasePagerHolder<D>{
/**上下文*/
protected Context mContext;
private int position;
SparseArray<View> sparseArray;
View itemView;
protected EjBasePagerHolder(View itemView){
this.itemView = itemView;
this.mContext = itemView.getContext();
sparseArray = new SparseArray<>();
initView();
}
public abstract void initView();
public View findViewById(int id){
View view = sparseArray.get(id);
if(null == view){
view = itemView.findViewById(id);
sparseArray.append(id,view);
}
return view;
}
public abstract void bindDada(D t,int position);
public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
public void setPosition(int position) {
this.position = position;
}
public int getPosition() {
return position;
}
public void onDestroy(){
sparseArray.clear();
}
}
}
簡(jiǎn)單用法
public class EjMainFmtBannerPagerAdapter extends EjBasePagerAdapter<EjMainFragmentDataBean>{
public EjMainFmtBannerPagerAdapter(List<EjMainFragmentDataBean> list) {
super(list);
}
@Override
protected EjBasePagerHolder<EjMainFragmentDataBean> onBundHolder(ViewGroup container) {
return new EjBasePagerHolder<EjMainFragmentDataBean>(LayoutInflater.from(container.getContext()).inflate(R.layout.ejmain_item_fmt_banner,null)) {
private ImageView ejmain_iv_banner;
@Override
public void initView() {
ejmain_iv_banner = (ImageView)findViewById(R.id.ejmain_iv_banner);
}
@Override
public void bindDada(EjMainFragmentDataBean t, int position) {
GlidUtil.loadUrl(t.img1,ejmain_iv_banner,mContext);
}
};
}
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android使用AudioManager修改系統(tǒng)音量的方法
這篇文章主要介紹了Android使用AudioManager修改系統(tǒng)音量的方法,結(jié)合實(shí)例形式分析了AudioManager調(diào)節(jié)音量的常用方法及相關(guān)使用技巧,需要的朋友可以參考下2016-08-08
flutter實(shí)現(xiàn)切換頁(yè)面緩存
這篇文章主要為大家詳細(xì)介紹了flutter實(shí)現(xiàn)切換頁(yè)面緩存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
AndroidStudio項(xiàng)目制作倒計(jì)時(shí)模塊的方法
本篇文章主要介紹了AndroidStudio項(xiàng)目制作倒計(jì)時(shí)模塊的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Android筆記設(shè)計(jì)范例之日記APP實(shí)現(xiàn)全流程
這篇文章主要介紹了Android筆記設(shè)計(jì)范例之日記APP實(shí)現(xiàn)全流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01
Android垂直滾動(dòng)控件ScrollView使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android垂直滾動(dòng)控件ScrollView的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
詳解Android中實(shí)現(xiàn)Redux方法
本篇文章給大家通過(guò)代碼實(shí)例教學(xué)Android中實(shí)現(xiàn)Redux的方法,有需要的朋友跟著參考下吧。2018-01-01
Android波紋擴(kuò)散效果之仿支付寶咻一咻功能實(shí)現(xiàn)波紋擴(kuò)散特效
這篇文章主要介紹了Android波紋擴(kuò)散效果之仿支付寶咻一咻功能實(shí)現(xiàn)波紋擴(kuò)散特效的相關(guān)資料,需要的朋友可以參考下2016-02-02
Android實(shí)現(xiàn)簡(jiǎn)單的答題系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單的答題系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

