Android - проблема с отложенной загрузкой списка просмотра

1

Я успешно выполнил ленивую загрузку для списка. Все в порядке; загрузка изображений и текста. У меня есть 2 текста для текста; Имя и описание. Я могу показать безупречно изображение и имя. Но как только я попытаюсь включить описание в него, это выглядит хорошо до определенной позиции. Программа принудительно закрывается в этом положении. Не могу понять, что заставляет его закрыть. Любая идея, что может быть причиной? Результаты, отображаемые на logcat, печатаются только до половины общего количества элементов для печати.

Программа может извлекать все изображения и отображать их правильно. Это точно. Но проблема в том, чтобы получить всю часть текстового контента. Он извлекает только половину всего доступного текста.

Я использую пример отсюда.

LazyAdapter.java

public class LazyAdapter extends BaseAdapter {

private Activity activity;
private String[] data;
private String[] text;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader; 

public LazyAdapter(Activity a, String[] d, String[] t) {
    activity = a;
    data=d;
    text = t;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new ImageLoader(activity.getApplicationContext());
}

public int getCount() {
    return data.length;
}    

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public static class ViewHolder{
    public TextView text;
    public ImageView image;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    ViewHolder holder;
    if(convertView==null){
        vi = inflater.inflate(R.layout.item, null);
        holder=new ViewHolder();
        holder.text=(TextView)vi.findViewById(R.id.text);;
        holder.image=(ImageView)vi.findViewById(R.id.image);
        vi.setTag(holder);
    }
    else
        holder=(ViewHolder)vi.getTag();

    holder.text.setText(text[position]);
    holder.image.setTag(data[position]);
    imageLoader.DisplayImage(data[position], activity, holder.image);
    return vi;
}
}

Исключение ошибки в logcat показано ниже.

ERROR/AndroidRuntime(270): java.lang.ArrayIndexOutOfBoundsException
ERROR/AndroidRuntime(270):     at com.lazy.LazyAdapter.getView(LazyAdapter.java:59)
ERROR/AndroidRuntime(270):     at android.widget.AbsListView.obtainView(AbsListView.java:1294)
ERROR/AndroidRuntime(270):     at android.widget.ListView.makeAndAddView(ListView.java:1727)
ERROR/AndroidRuntime(270):     at android.widget.ListView.fillDown(ListView.java:652)
ERROR/AndroidRuntime(270):     at android.widget.ListView.fillGap(ListView.java:623)
ERROR/AndroidRuntime(270):     at android.widget.AbsListView.trackMotionScroll    (AbsListView.java:2944)
ERROR/AndroidRuntime(270):     at android.widget.AbsListView$FlingRunnable.run   (AbsListView.java:2485)
ERROR/AndroidRuntime(270):     at android.os.Handler.handleCallback(Handler.java:587)
ERROR/AndroidRuntime(270):     at android.os.Handler.dispatchMessage(Handler.java:92)
ERROR/AndroidRuntime(270):     at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(270):     at android.app.ActivityThread.main(ActivityThread.java:4627)
ERROR/AndroidRuntime(270):     at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(270):     at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(270):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
ERROR/AndroidRuntime(270):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
ERROR/AndroidRuntime(270):     at dalvik.system.NativeStart.main(Native Method)
  • 0
    Вы смотрели на LogCat? Что это говорит?
  • 0
    Я напечатал свои результаты на logcat, и все в порядке. Полученные результаты совершенно верны. Но ошибка показывает: : 59)
Показать ещё 3 комментария
Теги:
listview
lazy-loading

2 ответа

2

Список массива или списка массивов, который вы отправляете в адаптер, может быть от какого-либо другого действия, этот список должен быть инициализирован вне onCreate() этого действия, чтобы он не обновлялся каждый раз при загрузке вашего списка.

Поэтому вероятное решение инициализирует его внутри onCreate. Например:

public static List<ClassObject> myList;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.create_event_main);
    myList= new ArrayList<ClassObject>();
    <b>/***Then set the adapter******/</b>

    ListView lv;
    lv = (ListView)findViewById(R.id.cem_listview);
    adapter = new LazyAdapter(MyActivity.this, R.layout.MyActivity,myList);
    lv.setAdapter(adapter);
}
1

По-видимому, вы столкнулись с разыменованием некоторого массива/массива в вашем datapter в LazyAdapter.java:59. В случае, если это была последняя запись, у вас есть, вероятно, одна за другой ошибка

Написание и выполнение значимых модульных тестов избавит вас от этого условия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню