Bina BaseAdapter tersuai yang boleh diguna semula


Pengenalan kepada bahagian ini:

Seperti tajuknya, bahagian ini membawakan anda pembinaan BaseAdapter tersuai yang boleh diguna semula Kami sering melibatkan ListView GridView dan kawalan Penyesuai lain memerlukan anda menulis kelas BaseAdapter lain sendiri, yang sangat menyusahkan. Untuk contoh lain, jika kita ingin memaparkan dua ListViews pada satu antara muka, kita juga memerlukan dua BaseAdapters... Pengaturcara suka bermalas-malasan. Dalam bahagian ini, kami akan menulis kelas BaseAdapter tersuai yang boleh diguna semula~


1 Mari kita mula mengubahnya sedikit demi sedikit:

Pertama sekali , kami menampal BaseAdapter tersuai yang ditulis di bahagian sebelumnya Kami akan menaik tarafnya kemudian

/**
 * Dibuat oleh Jay pada 2015/9/21 0021.
 */
kelas awam MyAdapter melanjutkan BaseAdapter {

    pribadi Context mContext;
    pribadi LinkedList<Data mData;

    public MyAdapter() {
    }

    public MyAdapter(LinkedList<Data> mData, Context mContext) {<🎜 m >  data =        ini. mContext = mContext;
    }

    @Override
    public int getCount() {
        return mData.size();
     >
    ><🎜 public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {<🎜 >   re turn 
@Override
paparan public getView (int kedudukan, lihat ConvertView, viewGroup induk) { holdholder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from ( mContext).inflate(R.layout.item_list, parent, false);
             holder = new ViewHolder();
            holder.img_icon = (ImageView) convertView.mg_conByI. holder.txt_content = (TextView) convertView.findViewById(R.id.txt_content);
            convertView.setTag(holder);
        } lainnya {
                                                                                                                                                                                              🎜 >        }
        holder.img_icon.setImageResource(mData.get(position).getImgId());
holder.txt_content.setText(mData.get(position).getContent());
return convertView;
}

//Tambah elemen
public void add(Data data) {
jika (mData == null) {
mData = New LinkedList<>();
}
mData.add(data);
notifyDataSetChan ged();
}

//Tambah elemen pada kedudukan tertentu
public void add(int position,Data data){
if (mData == null) {
mData = new LinkedList<> ( );
}
       mData.add(kedudukan, data); if(mData ! = null) {
mData.remove(data);
}
notifyDataSetChanged();
}

public void remove(int position) {
If(mData ! = null) {
mData.remove(position);
}
notifyDataSetChanged();
}

public void clear() {
if(mData != null ) {
mData.clear();
}
notifyDataSetChanged();
}

ViewHolder kelas persendirian {
ImageView img_icon;
TextView txt_content;
}

}


Naik Taraf 1: Tetapkan Entiti kepada generik

Baiklah, lagipun, kelas entiti Entiti yang kami lalui mungkin pelbagai jenis pelik, seperti Person, Book, Wether, dsb., jadi kami Tetapkan Entiti kepada generik, kod yang diubah suai adalah seperti berikut:

<pra>
kelas awam MyAdapter<T> memanjangkan BaseAdapter {

    pribadi Context mContext;
    private LinkedList<T> mData;

    public MyAdapter() {
    }

    public MyAdapter(LinkedList<T> mData, Context mContext) {<🎜 >  Data   =      ini. mContext = mContext;
    }

    @Override
    public int getCount() {
        return mData.size();
     >
    ><🎜 public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {<🎜 >   re turn 
@Override
paparan public getView (int kedudukan, lihat ConvertView, viewGroup induk) { holdholder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from ( mContext).inflate(R.layout.item_list, parent, false);
             holder = new ViewHolder();
            holder.img_icon = (ImageView) convertView.mg_conByI. holder.txt_content = (TextView) convertView.findViewById(R.id.txt_content);
            convertView.setTag(holder);
        } lainnya {
                                                                                                                                                                                              🎜 >        }
        holder.img_icon.setImageResource(mData.get(position).getImgId());
holder.txt_content.setText(mData.get(position).getContent());
return convertView;
}

//Tambah elemen
public void add(T data) {
jika (mData == null) {
mData = New LinkedList<>();
}
mData.add(data);
notifyDataSetChan ged();
}

//Tambah elemen pada kedudukan tertentu
public void add(int position,T data){
if (mData == null) {
mData = new LinkedList<> ( );
}
       mData.add(kedudukan, data); if(mData ! = null) {
mData.remove(data);
}
notifyDataSetChanged();
}

public void remove(int position) {
If(mData ! = null) {
mData.remove(position);
}
notifyDataSetChanged();
}

public void clear() {
if(mData != null ) {
mData.clear();
}
notifyDataSetChanged();
}

ViewHolder kelas persendirian {
ImageView img_icon;
TextView txt_content;
}

}

Baiklah, apa yang kami lakukan di atas hanyalah untuk menukar jenis Data kepada T generik!


Naik taraf 2: Naik taraf kelas ViewHolder:

Mari kita lihat dahulu perkara ViewHolder kami sebelum ini? Jawapan: findViewById, tetapkan status kawalan; Seterusnya, kami ingin menulis kebanyakan logik kaedah getView() ke dalam kelas ViewHolder berdasarkan melengkapkan ini. Perkara yang perlu dilakukan oleh ViewHolder ini:

  • Tentukan kaedah untuk mencari kawalan Idea kami adalah untuk mendedahkan kaedah awam dan menyampaikannya apabila memanggil kaedah. Kawal id dan tetapkan kandungan, seperti teks tetapan TextView: public ViewHolder setText(int id, CharSequence text){text setting}
  • Alihkan bahagian convertView reuse di sini, kemudian anda perlu lulus objek konteks, kita perlu mendapatkan Semua bahagian ditulis ke dalam pembina!
  • Tulis sekumpulan kaedah tetapan (awam), seperti menetapkan saiz teks, warna, latar belakang imej, dsb.!

Baiklah, mari ubah kelas ViewHolder kami langkah demi langkah


1) Parameter dan kaedah pembinaan yang berkaitan:

statik awam class ViewHolder {

private SparseArray<View> //Storage View dalam item ListView
private View item; //Storage convertView
private int position;        // Cursor
private Context konteks; //Konteks konteks

//Kaedah pembinaan untuk melengkapkan permulaan yang berkaitan
ViewHolder peribadi(Konteks konteks, induk ViewGroup, int layoutRes) {
mView s = new SparseArray<
this.context = konteks;
Lihat convertView = LayoutInflater.from(context).inflate(layoutRes, parent,false);
convertView.setTag (this); = convertView;
}

ImageView img_icon;
TextView txt_content;
}

2) Bind ViewHolder dan Item

Berdasarkan perkara di atas, kami menambah satu lagi kaedah mengikat

//Bind ViewHolder dan item<🎜 ​​>public static ViewHolder bind (Konteks konteks, View convertView, ViewGroup parent,
                                                                                                                    ViewHolder                                                 
pemegang = ViewHolder baharu( konteks, induk, susun aturRes);
}<> Lainnya {<🎎} (Lihat Pemegang) 🎜> holder.item = convertView;
}
holder.position = position;
return holder;
}



3) Dapatkan kawalan disimpan dalam koleksi mengikut id
awam <T meluaskan View> T getView( int id) {
T t = (T) mViews.get(id);

if( t == null) {

t = (T) item.findViewById(id);
mViews .put(id, t);
}
return t;
}

4) 接着我们再定义一堆暴露出来的方法

/**
* Dapatkan entri semasa
*/
* Dapatkan lokasi kemasukan
*/
umum Paparan ) {/mendapatkan Paparan Item }

/**
* Tetapkan teks
*/
public int getItemPosition() {
    kedudukan kembali;
}

/**
* Tetapkan imej
*/
public ViewHolder setText(int id, CharSequence text) {
    View view = getView(id);
    if(view instanceof TextView) {
        ((Text View) 🎜 set). >    }
    kembali ini;
}

/**
* Sediakan pemantauan klik
*/
public ViewHolder setImageResource(int id, int drawableRes) {
    View view = get ;
    jika(lihat contoh Paparan Imej) {
        ((Paparan Imej) paparan).setImageResource(drawableRes);
    } lainnya {
>        pandangan .set Sumber Latar Belakang);  draw Resource Latar Belakang); ini;
}


/**
* Tetapan kelihatan
*/
public ViewHolder setOnClickListener(int id, View.OnClickListener listener) {
   (getView(id).setOnClickListener );
    kembali ini;
}

/**
* Tetapkan tag
*/
public ViewHolder setVisibility(int id, int visible) {
    getView(id).set Visibility( kelihatan);
    kembali ini;
}

/**<🎝>*/
public ViewHolder setTag(int id, Object obj) {
    getView(id).setTag (obj);
    kembali ini;
}

//其他方法可自行扩展

Baiklah, transformasi dan naik taraf ViewHolder selesai~


Naik taraf 3: Tentukan kaedah abstrak untuk melengkapkan pengikatan set data ViewHolder dan Data

public abstract void bindView(ViewHolder holder, T obj);

Kami mencipta yang baharu BaseAdapter Apabila , laksanakan kaedah ini Selain itu, jangan lupa untuk menyesuaikan kami BaseAdapter ditukar kepada abstrak!


Naik taraf 4: Ubah suai kandungan bahagian getView()

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, mLayoutRes
            , position);
    bindView(holder,getItem(position));
    return holder.getItemView();
}

2 Selepas naik taraf, kami menulis kod untuk mengalaminya:

Kami ingin melaksanakan rendering:

1.png

Terdapat dua senarai di atas dengan reka letak yang berbeza, tetapi saya hanya menggunakan satu kelas BaseAdapter untuk mencapai kesan di atas!

Kod kunci adalah seperti berikut:

MainActivity.java:

kelas awam MainActivity melanjutkan AppCompatActivity {

    private Context mContext;
    private ListView list_book;
      private context  mContext MyAdapter<App> myAdapter1 = null;
    pribadi MyAdapter<Book> myAdapter2 = null;
    senarai peribadi<Apl> mData1 = null;
    senarai peribadi<Buku> mData2 = null;

    @Override
    dilindungi void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState . activity);
out 🎜>        mKonteks = MainActivity.this;
        init();

    }

    private void init() {

        list_book = (ListBy View) 
        list_app = (ListView) findViewById(R.id.list_app);

        //数据初始化
                                    mData        mData1.add(New App( R.mipmap.iv_icon_baidu,"百度"));
        mData1.add(new App(R.mipmap.iv_icon_douban,"豆瓣"));
        mData1.add(new App(R.mipmap.iv_icon_douban,"豆瓣"));
        mData 1.add(mi_fu.con.mData(ne_fu.con) "支付宝"));

        mData2 = new ArrayList<Book>();
        mData2.add(new Book("《第一"行䭚《第一頭")); 🎜>        mData2.add(new Book("《Android群英传》","徐宜生"));
         mData2.add(new Book("《Android开发王爱《开开发掉

        //Adapter初始化
        myAdapter1 = new MyAdapter<App>((ArrayList)mData1,R.layout.item_one)       ride@       ride            public void bindView(ViewHolder holder, App obj) {
                holder.setImageResource(R.id.img_icon,obj.getaIcon());
                    pemegang R.set . ;
            }
        };
        myAdapter2 = baharu MyAdapter<Book>((ArrayList)mData2,R layout.item.                                                                             . 🎜>            void bindView awam (pemegang ViewHolder, Buku obj ) {
                pemegang.setText(R.id.txt_bname,obj.getbName());
                holder.setText(R.id.txt_bauthor,obj.                       );        } ;

        //ListView设置下Penyesuai:
        list_book.setAdapter(myAdapter2);
        list_app.setAdapter(<🎜 ><🎜 ); >
}

BaseAdapter boleh guna semula yang kami tulis digunakan seperti yang diterangkan di atas~


3 Muat turun contoh kod:

ListViewDemo4.zip

siaran Muat turun MyAdapter yang terakhir ditulis. kelas, yang boleh dilanjutkan mengikut keperluan anda sendiri:

MyAdapter.java:

/**
 * Dibuat oleh Jay pada 2015/9/22 0022.
 */
kelas abstrak awam MyAdapter<T> memanjangkan BaseAdapter {

    pribadi ArrayList<T> mData;
    pribadi int mLayoutRes;           //布局id


    public MyAdapter() {
    }

    public MyAdapter(ArrayList<T> mData, int  m mData, int                                                                                                                          = Data;
        this.mLayoutRes = mLayoutRes;
    }

    @Override
    public int getCount() {
  !      atas   mData.size() : 0;
    }

    @Override
    public T getItem(int position) {
        return mData.get(position);   ><🎉 🎜>    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override     @Override  View            position return ibu bapa) {
Pemegang Pemandangan = ViewHolder.Bind (parent.getContext (), convertView, induk, mlayoutres
, kedudukan);
bindView (pemegang, getItem (kedudukan)); ;
    }

    public abstract void bindView(ViewHolder holder, T obj);

    //添加一个元素
      data    jika ( mData == null) {
            mData = new ArrayList<>();
        }
        mData.add(data);<🎜 >   bukan hangatkan    }

    //往特定位置,添加一个元素
    public void add(int position, T data) {
   =            =            =            =              mData = baharu ArrayList<> ;();
        }
        mData.add(kedudukan, data);
        notifyDat aSetChanged();
    }

                                          data ( mData != null) {
            mData.remove(data);
        }
        notifyDataSetChanged();
    }
        }
        notifyDataSetChanged();
    }<🎜                   <                    < >         jika ( mData != null) {
            mData.remove(position);
        }
        notifyDataSetChanged();
    }<🎜  >< clear      jika (mData ! = null) {
            mData.clear();
        }
        notifyDataSetChanged();
    }

<       }
        notifyDataSetChanged();
    }

<   class 
<    statik         peribadi SparseArray< ;Lihat> mViews;   //存储ListView 的 item中的View
        item Paparan peribadi;                  //存放convertView
         kedudukan int pribadi;               //游标
        konteks Konteks peribadi;            //Context上下文

        //构造方法,完成相关初始化
        private ViewHolder(Context context, ViewGroup parent, int layoutRes) {
            mViews = new SparseArray<>();
       =                                                                                                                                                                                                     LayoutInflater.from(context).inflate( layoutRes, ibu bapa, false);
            convertView.setTag(this);
            item = convertView;
        }

  /       一 View           statik ViewHolder bind (Konteks Konteks, Lihat ConvertView, ViewGroup Parent,
int Layoutres, Int Position) { Pemegang Pemegang;
} else {
holder = (viewHolder) convertView.getTag ();
holder.item = convertView;
}
holder.position = position;
pemegang pulangan;
}

@SuppressWarnings ("Unchecked")
public & lt; t melanjutkan pandangan & gt; T getView(int id) {
            T t = (T) mViews.get(id);
            jika (t == null) {
                t = (T) item.findViewById(id);
                mViews.put(id, t);       >     >  kembali t;
        }


        /**
         * Dapatkan entri semasa
          */
                                                   ** 🎝>*/
public int getItemposition () {
kedudukan kembali; view = getView(id);
            if (lihat instanceof TextView) {
                ((TextView) view).setText(text);
                                                                                                                                        
        }

        /**
* Dapatkan lokasi kemasukan
*/
        public ViewHolder setImageResource(int id, int drawableRes) {
              View view = getView(id);<🎜            if (lihat instanceof ImageView) {
                 ((Paparan Imej) view).setImageResource(drawableRes);
            } lain {
                        set sumber semula tanah ;          }
            kembali ini;
         }


        /**
*Sediakan pemantauan klik
*/
        public ViewHolder setOnClickListener(int id, View.OnClickListener pendengar)>    Listen Listener                                                 set er(pendengar);
Kembalikan ini;
}

/**
* Tetapan kelihatan
*/
setvisibility viewHolder awam (int id, int boleh dilihat) {
getView (id) .setVisibility (kelihatan);
            kembalikan ini;
        }

        /**
* Tetapkan tag
*/
                                                                                                                                                                                       (id).setTag(obj);
            kembali ini;
        }

        //其他方法可自行扩展
< >
        //其他方法可自行扩展
< >

< >

Ringkasan bahagian ini:

Bahagian ini memperkenalkan cara melaksanakan BaseAdapter yang boleh diguna semula Sudah tentu, anda boleh menggunakan ini berdasarkan Ubah suai mengikut keperluan anda sendiri, seperti menetapkan imej rangkaian secara tidak segerak, dsb. Kod yang diubah suai ditulis dengan merujuk kepada video Hong Yang: Pautan video: Android - Mencipta penyesuai universal Selain itu, saya menghadapi beberapa masalah semasa penulisan sebenar Terima kasih banyak Berial (B God) atas kesabaran anda~2.jpgありがとうございます~