2010-03-08 23 views
11

'a verir. Bir sonraki yardımın ya da ipucunun gitmesi için çok teşekkür ederim.Bir SimpleCursorAdapter içinde getView'i geçersiz kılmaya çalışmak, NullPointerExceptio

ListView'de bir satırın içeriğini program aracılığıyla değiştirmeye çalışıyorum. Bir satırda 3 TextView ve bir ProgressBar vardır. Geçerli satırın 'result' sütunu sıfır ise ProgressBar'ı canlandırmak istiyorum.

Bazı öğreticiler ve dokümanlar okuduktan sonra, LayoutInflater'in kullanılması ve getView() - overriden olduğu sonucuna vardım. Belki bu konuda yanılıyorum.

İşlevden row = inflater.inflate(R.layout.row, null); döndürürsem, NullPointerException değerini verir.

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

Yığın İzleme geçerli::

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

"Res/layout" klasörünüzde * row.xml * var mı? Bu, NullPointerException öğesinin nereden geldiği olabilir. –

+1

evet, var, res/layout/row.xml –

cevap

19

CursorAdapter ve alt sınıfları için, newView() ve bindView() yerine getView() geçersiz kılar İşte

kodudur.

Daha da önemlisi, super.getView() numaralı telefonu aramamalısınız. İşte burada çöküşün var.

+0

Teşekkür ederiz! Görünüm satırı = inflater.inflate (R.layout.row, null); yerine View row = super.getView (konum, convertView, parent); , NUllPointer sorununu çözer! –

+0

@CommonsWare, CursorAdapter ile Satır Geri Dönüşümü nasıl sağlanır? – h4ck3d

+0

@Droider: CursorAdapter'ın sizin için newView() işlevini kullanmasına izin verirseniz, geri dönüşüm işlemini gerçekleştirir. – CommonsWare

2

SimpleCursorAdapter sınıfını genişletirken getView()'a gerek yoktur. getView()'un tüm işlevselliği, newView() ve bindView() yöntemlerinden yararlanıyor.

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

Bir ana fark getView(); Parametre olarak pozisyonumuz var ve simpleCursorAdapter pozisyonunda getPositionForView(view) görünümü bindView() parametresidir.

örnek: Çoğunlukla böylece ListViewObj.getPositionForView(view)

1

diyoruz ... değerlerini koymak Listview kullanıyor Aslında özel bağlama elde etmek için ViewBinder kullanmalıdır. Bu şekilde herhangi bir kodu geçersiz kılmanız gerekmez. Görünümün değerini ayarladığınızda, true döndürdüğünüzden emin olun, aksi halde bağdaştırıcı, değerin üzerine yazacaktır.

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; 
    } 
} 
İlgili konular