2013-03-17 139 views
0

Android 2.3.3ListView - 自定義適配器 - CursorIndexOutOfBound異常

我正在使用自定義適配器來填充列表視圖。列表視圖中的每一行都有3個文本視圖(自定義佈局),它們是從數據庫檢索的數據中填充的。

問題是,數據第一次正確顯示。但是,當我向下滾動,然後再次向上滾動列表視圖時,出現以下異常。

03-17 08:55:37.789: E/AndroidRuntime(574): FATAL EXCEPTION: main 
03-17 08:55:37.789: E/AndroidRuntime(574): android.database.CursorIndexOutOfBoundsException: Index 7 requested, with a size of 7 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41) 
03-17 08:55:37.789: E/AndroidRuntime(574): at com.mobilevoiceapps.advancedvoicecalculatorfree.History$MyCustomAdapter.getView(History.java:111) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.widget.AbsListView.obtainView(AbsListView.java:1588) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.widget.ListView.makeAndAddView(ListView.java:1772) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.widget.ListView.fillDown(ListView.java:695) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.widget.ListView.correctTooLow(ListView.java:1445) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.widget.ListView.fillGap(ListView.java:672) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4176) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.widget.AbsListView.onTouchEvent(AbsListView.java:2609) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.widget.ListView.onTouchEvent(ListView.java:3677) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.view.View.dispatchTouchEvent(View.java:3885) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-17 08:55:37.789: E/AndroidRuntime(574): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1750) 
03-17 08:55:37.789: E/AndroidRuntime(574): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1131) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.app.Activity.dispatchTouchEvent(Activity.java:2096) 
03-17 08:55:37.789: E/AndroidRuntime(574): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1734) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2200) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.view.ViewRoot.handleMessage(ViewRoot.java:1884) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.os.Looper.loop(Looper.java:130) 
03-17 08:55:37.789: E/AndroidRuntime(574): at android.app.ActivityThread.main(ActivityThread.java:3687) 
03-17 08:55:37.789: E/AndroidRuntime(574): at java.lang.reflect.Method.invokeNative(Native Method) 
03-17 08:55:37.789: E/AndroidRuntime(574): at java.lang.reflect.Method.invoke(Method.java:507) 
03-17 08:55:37.789: E/AndroidRuntime(574): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
03-17 08:55:37.789: E/AndroidRuntime(574): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
03-17 08:55:37.789: E/AndroidRuntime(574): at dalvik.system.NativeStart.main(Native Method) 

這裏是我使用)的代碼...

從數據庫中檢索.. 公共光標retrieve_history( {

 c = db.rawQuery("select * from history", null); 
     return c; 
    } 

自定義佈局 - ListView的行

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:paddingBottom="5dp" 
    android:paddingLeft="5dp" 
    android:paddingRight="5dp" 
    android:paddingTop="5dp" > 

    <TextView 
     android:id="@+id/txtView_History_Count" 
     android:layout_width="0dip" 
     android:layout_height="50dp" 
     android:layout_weight="0.20" 
     android:text="Number" 
     android:textColor="#FFFFFF" 
     android:textSize="22dp" 
     android:paddingLeft="5dp" 
     android:gravity="center" /> 

    <LinearLayout 
     android:id="@+id/ll2" 
     android:layout_width="0dip" 
     android:layout_height="50dp" 
     android:layout_weight="0.80" 
     android:orientation="vertical" 
     android:paddingLeft="5dp" > 

     <TextView 
      android:id="@+id/txtView_History_Result" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="Result" 
      android:textColor="#316DA2" 
      android:textSize="22dp" /> 

     <TextView 
      android:id="@+id/txtView_History_Expression" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="Expression" 
      android:textColor="#FFFFFF" 
      android:textSize="15dp" /> 
    </LinearLayout> 

</LinearLayout> 

自定義適配器

class MyCustomAdapter extends BaseAdapter{ 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return c.getCount(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     LayoutInflater li = getLayoutInflater(); 
     convertView = li.inflate(R.layout.history_row, null); 

     TextView cnt = (TextView) convertView.findViewById(R.id.txtView_History_Count); 
     TextView exp = (TextView) convertView.findViewById(R.id.txtView_History_Expression); 
     TextView res = (TextView) convertView.findViewById(R.id.txtView_History_Result); 

       cnt.setText(String.valueOf(count));  
       System.out.println(cnt.getText().toString()); 

       expression = c.getString(c.getColumnIndex("expression")); 
       result = c.getString(c.getColumnIndex("result")); 

       if(!c.isAfterLast()) 
       { 
        c.moveToNext(); 
        count++; 
        //c.moveToFirst(); 
       }    


       exp.setText(expression); 
       System.out.println(exp.getText().toString()); 
       res.setText(result); 
       System.out.println(res.getText().toString()); 


     return convertView; 
    } 

} 

在此先感謝!

回答

0

嘗試利用的

c.moveToPosition(int position);// Move the cursor to an absolute position. 

的getview方法裏面,這樣就可以在設置列表視圖行正確的數據..

+0

現在,除了走了,但在顯示的列表視圖第一次,第一行重複兩次,最後一項不顯示,當我再次向下滾動時,最後一項顯示在最上面。 – 2013-03-17 04:11:25

+0

由於您未使用Holder重複使用convertview對象,因此您正面臨此問題。 請通過此鏈接瞭解View Holder類的使用情況 http://www.jmanzano.es/blog/?p = 166 – 2013-03-17 04:27:45