56 votes

Incident dans ListView sur AbsListView.obtainView pour ListActivity

Je suis de regarder le contenu des mises à jour sur une ListActivity à l'aide d'un ContentObserver comme suit:

protected void onCreate(Bundle savedState)
   {
        super.onCreate(savedState);

        ContentResolver cr = getContentResolver();

        Cursor cursor = cr.query(TrackHeader.CONTENT_URI, sTrackListProjection, null, null, null);
        startManagingCursor(cursor);

        this.mAdapter = new TrackHeaderDataAdapter(this, R.layout.track_list_item, cursor, sTrackListProjection, null);
        setListAdapter(mAdapter);

        Handler handler = new Handler();

        mTrackHeaderObserver = new ContentObserver(handler) {

             @Override 
             public boolean deliverSelfNotifications() { 
                 return false;
             }

             @Override
             public void onChange(boolean selfChange) {
                 super.onChange(selfChange);
                 ContentResolver cr = getContentResolver();
                 mAdapter.changeCursor(cr.query(TrackHeader.CONTENT_URI, sTrackListProjection, null, null, null));
              }
         };

      getContentResolver().registerContentObserver (TrackHeader.CONTENT_URI, true, mTrackHeaderObserver);
  }

Ce contenu observateur semble être ok -- il est appelé à revenir sur le thread de l'INTERFACE utilisateur, mais je suis à l'obtention des crashs aléatoires assez prévisible sur le sous-jacent ListView:

02-21 14:06:00.440: ERROR/AndroidRuntime(739): java.lang.NullPointerException
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at  android.widget.AbsListView.obtainView(AbsListView.java:1276)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.ListView.makeAndAddView(ListView.java:1668)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.ListView.fillDown(ListView.java:637)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.ListView.fillSpecific(ListView.java:1224)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.ListView.layoutChildren(ListView.java:1499)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.AbsListView.onLayout(AbsListView.java:1113)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.ViewRoot.performTraversals(ViewRoot.java:996)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.os.Looper.loop(Looper.java:123)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.app.ActivityThread.main(ActivityThread.java:4363)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at java.lang.reflect.Method.invokeNative(Native Method)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at java.lang.reflect.Method.invoke(Method.java:521)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at dalvik.system.NativeStart.main(Native Method)
02-21 14:09:56.159: ERROR/AndroidRuntime(749): ERROR: thread attach failed
02-21 14:09:59.480: ERROR/AndroidRuntime(760): ERROR: thread attach failed
02-21 14:12:19.449: ERROR/AndroidRuntime(778): ERROR: thread attach failed
02-21 14:12:22.779: ERROR/AndroidRuntime(789): ERROR: thread attach failed
02-21 14:12:26.479: ERROR/gralloc(51): [unregister] handle 0x3f13b8 still locked (state=40000001)

Toute personne rien vu de tel avant -- été perplexe sur celui-ci pendant quelques jours...

Tim

228voto

jonny99 Points 1491

J'ai eu un semblable de trace de pile et j'ai découvert que j'étais de retour null à partir de mon getView() dans certains cas.

11voto

Skywalker Points 61

Si vous avez une liste et d'étendre BaseAdapter ou Adaptateur pour obtenir une liste personnalisée, assurez-vous que getView renvoie une valeur non nulle.

Si vous avez un affichage des onglets et l'un de vos fragment est une liste de remplacer l'Adaptateur de BaseAdapter et getView renvoie la valeur null, vous obtiendrez ce problème.

4voto

Merve Gencer Points 21

Si vous utilisez une classe statique ViewHolder pour stocker vos afficher les éléments dans la carte, vous pouvez avez oublié de mettre le viewHolder objet que le tag de la convertView. E. g:

if (convertView == null) {
    LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.adapter_drivers_and_riders, null);
        holder = new ViewHolder();
        holder.tvDate = (TextView)convertView.findViewById(R.id.tvDate);
        holder.tvTime = (TextView)convertView.findViewById(R.id.tvTime);

        convertView.setTag(holder);

} else {
    holder = (ViewHolder) convertView.getTag();
}

Dans mon cas, je n'étais pas à l'aide d'un Curseur, mais ayant le même problème, je me suis rendu compte que j'ai oublié de définir la balise comme viewHolder à convertView ainsi, lorsque la première carte de vues sont créées pour la liste, c'est ok, mais lorsque vous faites défiler et de recyclage du fonctionnement du mécanisme, il se bloque car il ne peut pas restaurer la viewHolder de convertView.

Juste au cas où, je voulais mentionner.

3voto

CommonsWare Points 402670

Je n'ai pas utilisé changeCursor(). Et, depuis la requête que vous avez utilisé pour créer l' Cursor est la même que celle de la requête que vous utilisez pour "changer" le curseur, j'avais le vidage de l' changeCursor() appel pure et simple et juste appelez - requery() sur le Cursor vous avez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X