2011-12-12 139 views
1

我已經成功實現了列表視圖的延遲加載。一切正常;加載圖像和文字。我有2條文字信息;名稱和說明。我能夠完美地顯示圖像和名稱。但是,一旦我嘗試在其中包含描述,在某個位置之前似乎沒有問題。程序在該位置被強制關閉。無法弄清楚是什麼導致它關閉。任何想法可能是什麼原因?在logcat上顯示的結果僅打印到要打印的項目總數的大約一半。Android - 懶加載列表視圖

程序能夠檢索所有圖像並正確顯示它們。這是肯定的。但有問題檢索整個文本內容。它只檢索可用文本總數的一半。

我使用here的示例。在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; 
} 
} 

錯誤異常如下所示。

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嗎?它說什麼? – Squonk

+0

我在logcat上打印了我的結果,一切都很好。檢索結果完全正確。但錯誤顯示 - 07:42:42.230:ERROR/AndroidRuntime(270):java.lang.ArrayIndexOutOfBoundsException,07:42:42.230:ERROR/AndroidRuntime(270):at tp.edu.sg.LazyAdapter.getView(LazyAdapter.java :59) – Hend

+0

當您滾動到最底部的項目時會出現問題嗎? –

回答

1

顯然你用deiteating一些數組/數組列表在LazyAdapter.java:59你的數據庫愚蠢。如果這是最後一次輸入,那麼最有可能是錯誤的錯誤

編寫和執行有意義的單元測試可以讓您免於此情況。

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); 
}