1

我正在編寫Android TV應用程序,並且遇到了此問題。我必須在接收事件時將新的BrowseFragment中的所有行都替換掉。 我已經試過:Android TV重新載入BrowseFragment中的數據

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

哪裏mRowsAdapter是ListRow項目ArrayObjectAdapter。 也試過這種方法:

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

而且從this question的解決方案。它們都不起作用。我不斷收到IOBE。這裏是日誌:

       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) 

請幫助。謝謝。

+0

你檢查你的陣列/容器?我想你試圖從一個大小爲0的數組中獲取索引,這意味着它是空的。「 – noogui

+0

我不確定你是否理解我在我的問題中寫的內容 –

+0

當你看到實際的Leanback源時它確實有幫助代碼 –

回答

0

由於適配器中的內部對象數組嘗試使用自己的大小來確定添加項目的位置,因此您已獲取索引超出範圍。

當你調用。新增()其內部這樣做 -

/** 
* 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); 
} 

這意味着一些你怎麼叫清晰暫時離開的東西失衡和內部指標是關閉的它實際上是什麼和arraylist是一個IOBE。也許嘗試使用add(0,yourArray)來代替。

編輯:

嘗試加入某種驗證您添加對象之前。喜歡的東西:

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

我閱讀了源代碼。在'clear()'方法中,你可以看到mItems.clear()這行將mItems.size()設置爲0.我用調試器檢查過它,並且在這方面一切正常。與數據,FC在下一次UI重繪過程中發生,仍然不知道如何擊敗它 –

+0

使用addAll()方法怎麼樣?你有沒有試過? –

+0

是的,同樣的結果 –

0

嘗試這樣做:

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

試過了,沒有幫助。此外,你的第二行在內部調用第三行,所以你不必明確地調用它。無論如何,它沒有或沒有它的工作。 –

+0

它應該工作,但也許你正在做一個錯誤的適配器,或在一個新的實例......我無法弄清楚這個代碼。 –