Saya mencoba membuat Adaptor khusus untuk ListView saya karena setiap item dalam daftar dapat memiliki tampilan berbeda (tautan, toggle, atau grup radio), tetapi ketika saya mencoba menjalankan Aktivitas yang menggunakan ListView saya menerima kesalahan dan aplikasi berhenti. Aplikasi ini ditargetkan untuk platform Android 1.6.
Kode:
public class MenuListAdapter extends BaseAdapter {
private static final String LOG_KEY = MenuListAdapter.class.getSimpleName();
protected List<MenuItem> list;
protected Context ctx;
protected LayoutInflater inflater;
public MenuListAdapter(Context context, List<MenuItem> objects) {
this.list = objects;
this.ctx = context;
this.inflater = (LayoutInflater)this.ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i(LOG_KEY, "Position: " + position + "; convertView = " + convertView + "; parent=" + parent);
MenuItem item = list.get(position);
Log.i(LOG_KEY, "Item=" + item );
if (convertView == null) {
convertView = this.inflater.inflate(item.getLayout(), null);
}
return convertView;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return true;
}
@Override
public int getCount() {
return this.list.size();
}
@Override
public MenuItem getItem(int position) {
return this.list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
Log.i(LOG_KEY, "getItemViewType: " + this.list.get(position).getLayout());
return this.list.get(position).getLayout();
}
@Override
public int getViewTypeCount() {
Log.i(LOG_KEY, "getViewTypeCount: " + this.list.size());
return this.list.size();
}
}
Kesalahan yang saya terima:
java.lang.ArrayIndexOutOfBoundsException
at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:3523)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1158)
at android.widget.ListView.onMeasure(ListView.java:1060)
at android.view.View.measure(View.java:7703)
Saya tahu bahwa aplikasi kembali dari getView
dan semuanya tampak beres.
Setiap ide tentang apa yang menyebabkan ini akan dihargai.
Terima kasih,
-Dan
Jawaban:
Jenis tampilan item tempat Anda kembali
getItemViewType()
adalah>= getViewTypeCount()
.sumber
Jawaban yang diterima benar. Inilah yang saya lakukan untuk menghindari masalah:
sumber
getItemViewType
tidak kembali ke IntMasalah muncul saat nilai getItemType salah. Nilai ini harus berupa bilangan bulat dan harus dari 0 hingga getViewTypeCount () - 1.
sumber
Alasannya, kemungkinan besar karena metode getItemViewType mengembalikan nilai yang salah! Setiap baris dalam tampilan daftar adalah Tampilan satu. Sementara scrooling getItemViewType mencapai lebih dari hitungan View.
Apa yang harus dilakukan? Bagaimana cara menghindari masalah?
Pertama-tama tentukan tampilan (baris) dalam tampilan daftar Anda yang ditampilkan terlebih dahulu. Sementara Menggulir menggunakan persamaan moduler
Dalam contoh ini ada sepuluh tampilan (10 baris).
Penting
Beberapa pengguna menyebutkan pertanyaan lain tentang stackoverflow metode itu
pada metode overView getView.
sumber