1

J'écris une application Android TV et j'ai rencontré ce problème. Je dois remplacer toutes les lignes dans BrowseFragment avec de nouvelles à la réception d'un événement. Ce que j'ai essayé:Android TV recharge des données dans BrowseFragment

mRowsAdapter.clear(); 
... 
mRowsAdapter.add(add new rows here); 

Où mRowsAdapter est le ArrayObjectAdapter avec des articles de ListRow. a également essayé cette approche:

mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); 
setAdapter(mRowsAdapter); 
mRowsAdapter.add(add new rows here); 

Et les solutions de this question. Aucun d'entre eux ne fonctionne. Je continue à recevoir IOBE. Voici les journaux:

       java.lang.IndexOutOfBoundsException: Index: 7, Size: 0 
            at java.util.ArrayList.get(ArrayList.java:411) 
            at android.support.v17.leanback.widget.ArrayObjectAdapter.get(ArrayObjectAdapter.java:56) 
            at android.support.v17.leanback.app.ListRowDataAdapter.get(ListRowDataAdapter.java:65) 
            at android.support.v17.leanback.widget.ItemBridgeAdapter.getItemViewType(ItemBridgeAdapter.java:248) 
            at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5046) 
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5172) 
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5153) 
            at android.support.v17.leanback.widget.GridLayoutManager.getViewForPosition(GridLayoutManager.java:971) 
            at android.support.v17.leanback.widget.GridLayoutManager$2.createItem(GridLayoutManager.java:1464) 
            at android.support.v17.leanback.widget.SingleRow.appendVisibleItems(SingleRow.java:111) 
            at android.support.v17.leanback.widget.Grid.appendVisibleItems(Grid.java:371) 
            at android.support.v17.leanback.widget.GridLayoutManager.appendVisibleItems(GridLayoutManager.java:1702) 
            at android.support.v17.leanback.widget.GridLayoutManager.fastRelayout(GridLayoutManager.java:1764) 
            at android.support.v17.leanback.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:1888) 
            at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3374) 
            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3183) 
            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3627) 
            at android.view.View.layout(View.java:17519) 
            at android.view.ViewGroup.layout(ViewGroup.java:5612) 
            at android.support.v17.leanback.widget.ScaleFrameLayout.onLayout(ScaleFrameLayout.java:172) 
            at android.view.View.layout(View.java:17519) 
            at android.view.ViewGroup.layout(ViewGroup.java:5612) 
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
            at android.view.View.layout(View.java:17519) 
            at android.view.ViewGroup.layout(ViewGroup.java:5612) 
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
            at android.view.View.layout(View.java:17519) 
            at android.view.ViewGroup.layout(ViewGroup.java:5612) 
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
            at android.view.View.layout(View.java:17519) 
            at android.view.ViewGroup.layout(ViewGroup.java:5612) 
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
            at android.view.View.layout(View.java:17519) 
            at android.view.ViewGroup.layout(ViewGroup.java:5612) 
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 
            at android.view.View.layout(View.java:17519) 
            at android.view.ViewGroup.layout(ViewGroup.java:5612) 
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
            at com.android.internal.policy.DecorView.onLayout(DecorView.java:724) 
            at android.view.View.layout(View.java:17519) 
            at android.view.ViewGroup.layout(ViewGroup.java:5612) 
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342) 
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2069) 
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246) 
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301) 
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) 
            at android.view.Choreographer.doCallbacks(Choreographer.java:683) 
            at android.view.Choreographer.doFrame(Choreographer.java:619) 
com.cloudify E/AndroidRuntime:  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) 
            at android.os.Handler.handleCallback(Handler.java:751) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:154) 
            at android.app.ActivityThread.main(ActivityThread.java:6077) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

Aidez-nous s'il vous plaît. Je vous remercie.

+0

Avez-vous vérifié votre tableau/conteneur? Je pense que vous essayez d'aller chercher un index à partir d'un tableau de taille 0, ce qui signifie qu'il est vide. " – noogui

+0

Je ne suis pas sûr que vous ayez compris ce que j'ai écrit dans ma question –

+0

Cela aide vraiment quand vous regardez la source réelle code –

Répondre

0

Vous obtenez un index hors limites car la matrice interne d'objets de l'adaptateur tente d'utiliser sa propre taille pour déterminer où ajouter les éléments.

Lorsque vous appelez .add() le faire en interne ce -

/** 
* Adds an item to the end of the list. 
* 
* @param item The item to add to the end of the list. 
*/ 
public void add(Object item) { 
    add(mItems.size(), item); 
} 
/** 
* Inserts an item into this list at the specified index. 
* 
* @param index The index at which the item should be inserted. 
* @param item The item to insert into the list. 
*/ 
public void add(int index, Object item) { 
    mItems.add(index, item); 
    notifyItemRangeInserted(index, 1); 
} 

cela signifie que certains comment vous appeler clair quitte temporairement quelque chose détraqué et l'indice interne est hors de ce qu'il est en réalité et l'arrayliste caca un IOBE. Essayez peut-être d'utiliser add (0, yourArray) à la place.

EDIT:

essayer d'ajouter une sorte de validation avant d'ajouter vos objets. Quelque chose comme:

if((myAdapter.size() - 1) > indexImTryingToAddAt) 
{ 
    myAdapter.addAll(indexImTryingToAddAt, arrayOfObjects); 
} 
else 
{ 
    Log.d("index is larger than current adapter", indexImTryingToAddAt+""); 
} 
+0

J'ai lu les sources. dans la méthode 'clear()', vous pouvez voir la ligne mItems.clear() qui met le mItems.size() à 0. Je l'ai vérifié avec le débogueur et tout fonctionne bien à cet égard, l'adaptateur est effacé et re-rempli avec les données, le FC se produit lors de la prochaine mise à jour de l'interface utilisateur –

+0

comment utiliser la méthode addAll() Avez-vous essayé cela? –

+0

oui même résultat –

0

Essayez de le faire:

 
    mRowsAdapter.clear(); 
    mRowsAdapter.add(add new rows here); 
    mRowsAdapter.notifyArrayItemRangeChanged(0, mRowsAdapter.size()); 
+0

J'ai essayé cela, n'a pas aidé. De plus, votre deuxième ligne appelle le troisième en interne, vous n'avez donc pas à l'appeler explicitement. De toute façon ça ne marche pas avec ou sans ça. –

+0

Cela devrait fonctionner, mais peut-être que vous le faites sur un mauvais adaptateur, ou sur une nouvelle instance ... Je ne peux pas le comprendre avec ce code. –