2010-03-08 2 views
11

Apprezzerei molto qualsiasi aiuto o suggerimento su cui andare dopo.Provare a scavalcare getView in un SimpleCursorAdapter dà NullPointerExceptio

Sto cercando di modificare il contenuto di una riga in ListView a livello di codice. In una riga ci sono 3 TextView e ProgressBar. Voglio animare il ProgressBar se la colonna 'risultato' della riga corrente è zero.

Dopo aver letto alcuni tutorial e documenti, sono giunto alla conclusione che LayoutInflater deve essere utilizzato e getView() - sovrascritto. Forse mi sbaglio su questo.

Se restituisco row = inflater.inflate(R.layout.row, null); dalla funzione, fornisce NullPointerException.

Ecco il codice:

private final class mySimpleCursorAdapter extends SimpleCursorAdapter { 

    private Cursor localCursor; 
    private Context localContext; 

    public mySimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to);    
     this.localCursor = c; 
     this.localContext = context; 

    } 

    /** 
    * 1. ListView asks adapter "give me a view" (getView) for each item of the list 
    * 2. A new View is returned and displayed 
    */ 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = super.getView(position, convertView, parent); 

     LayoutInflater inflater = (LayoutInflater)localContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     String result = localCursor.getString(2); 
     int resInt = Integer.parseInt(result); 

     Log.d(TAG, "row " + row); 

     // if 'result' column form the TABLE is 0, do something useful: 
     if(resInt == 0) {   
      ProgressBar progress = (ProgressBar) row.findViewById(R.id.update_progress); 
      progress.setIndeterminate(true); 

      TextView edit1 = (TextView)row.findViewById(R.id.row_id); 
      TextView edit2 = (TextView)row.findViewById(R.id.request); 
      TextView edit3 = (TextView)row.findViewById(R.id.result); 
      edit1.setText("1"); 
      edit2.setText("2"); 
      edit3.setText("3"); 
      row = inflater.inflate(R.layout.row, null);    
     } 

     return row; 
    } 

Ecco l'Analisi dello stack:

03-08 03:15:29.639: ERROR/AndroidRuntime(619): java.lang.NullPointerException 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:149) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.CursorAdapter.getView(CursorAdapter.java:186) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at com.dhristov.test1.test1$mySimpleCursorAdapter.getView(test1.java:105) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.AbsListView.obtainView(AbsListView.java:1256) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.ListView.makeAndAddView(ListView.java:1668) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.ListView.fillDown(ListView.java:637) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.ListView.fillSpecific(ListView.java:1224) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.ListView.layoutChildren(ListView.java:1499) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.AbsListView.onLayout(AbsListView.java:1113) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.view.View.layout(View.java:6830) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.LinearLayout.onLayout(LinearLayout.java:918) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.view.View.layout(View.java:6830) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.LinearLayout.onLayout(LinearLayout.java:918) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.view.View.layout(View.java:6830) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.view.View.layout(View.java:6830) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.LinearLayout.onLayout(LinearLayout.java:918) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.view.View.layout(View.java:6830) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.view.View.layout(View.java:6830) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.view.ViewRoot.performTraversals(ViewRoot.java:996) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.os.Looper.loop(Looper.java:123) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
03-08 03:15:29.639: ERROR/AndroidRuntime(619):  at dalvik.system.NativeStart.main(Native Method) 
+1

Avete un * row.xml * nella cartella 'res/layout'? Potrebbe essere il luogo da cui proviene 'NullPointerException'. –

+1

sì, ce l'ho, res/layout/row.xml –

risposta

19

Per CursorAdapter e sottoclassi, si dovrebbe ignorare newView() e bindView() invece di getView().

Ancora più importante, però, non si dovrebbe chiamare super.getView(). È qui che ti stai schiantando.

+0

Grazie! Visualizza riga = inflater.inflate (R.layout.row, null); anziché Visualizza riga = super.getView (posizione, convertView, padre); risolve il problema di NUllPointer! –

+0

@CommonsWare, Come garantire il riciclaggio di righe con CursorAdapter, quindi? – h4ck3d

+0

@Droider: se lasci che 'CursorAdapter' gestisca' newView() 'per te, eseguirà il riciclo. – CommonsWare

2

Non è necessario per getView() estendere la classe SimpleCursorAdapter. Tutte le funzionalità di getView() vengono ricavate dai metodi overridati newView() e bindView().

if (convertview == null) // is equal to `newView()` and 
if (convertview != null) // is equal to `bindView()` 

Una differenza principale è in getView(); abbiamo la posizione come parametro e in simpleCursorAdapter otteniamo la posizione come getPositionForView(view) la vista è un parametro di bindView().

esempio: Principalmente stiamo usando Listview mettere valori ... così si chiama ListViewObj.getPositionForView(view)

1

In realtà si dovrebbe usare un ViewBinder per raggiungere vincolante la vostra abitudine. In questo modo non devi sovrascrivere alcun codice. Assicurati di restituire true quando hai impostato il valore della vista altrimenti l'adattatore sovrascriverà il valore.

public void refresh() { 
    Cursor cursor = ....get cursor.... 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      R.layout.list_item, 
      cursor, 
      new String[] { KEY_NAME, KEY_SHORT_DESC}, 
      new int[] { R.id.icon, R.id.text1}); 
    adapter.setViewBinder(new ProductViewBinder()); 
    setAdapter(adapter); 
} 

private static class ProductViewBinder implements ViewBinder { 

    public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
     if (view instanceof ProgressBar) { 
      String result = cursor.getString(2); 
      Int resInt = Int.parseInt(result); 

      if (resInt == 0) { 
       ((ProgressBar)view).setIndeterminate(true); 
       return true; 
      } 
     } 

     return false; 
    } 
}