2015-11-23 44 views
3

我想重新加載瀏覽片段中的一些行數據。基本上我想重置適配器數據,而不會在瀏覽片段中導致類似Flash的效果。任何想法如何實現類似於列表視圖中的notifyDataSetChanged()。android tv - 加載適配器數據

感謝名單

+0

只是用adapter.add(項目)增加值到適配器。在添加到現有值的情況下,或者執行adapter.clear()和添加。 – Dhina

回答

1

我回答這個問題,類似的東西: Dynamically add more cards in a list Row android TV leanback

我會從那裏複製我的答案。希望這有助於。

將項目添加到演示者;

CardPresenter channelCardPresenter = new CardPresenter(); 
ArrayObjectAdapter channelRowAdapter = new ArrayObjectAdapter(channelCardPresenter); 
channelRowAdapter.add(new Movie("Movie Title")); 
HeaderItem header = new HeaderItem(0, "My Channels"); 
mRowsAdapter.add(new ListRow(header, channelRowAdapter)); 

當然,這可能只適用於您第一次創建用戶界面。未來的時代可能不會這樣做。在我的應用程序,https://github.com/Fleker/CumulusTV/blob/e85b7aa153fcd7bb5d1b23127a8002f3a8204120/app/src/main/java/com/felkertech/n/tv/LeanbackFragment.java,我創建了一個將被我想要做的應用程序的完全重繪每次調用的方法:

public void refreshUI() { 
    prepareBackgroundManager(); 
    setupUIElements(); 
    loadRows(); //Generate and populate all the rows 
    setupEventListeners(); 
} 
+0

您的鏈接已損壞,您可以再發布一次嗎? – joe

+1

自從我最初發布答案以來,我對代碼庫做了很多更改。我回顧了提交歷史記錄,並在回答時更新了URL以指向該文件。 –

1

您可以創建自己的適配器,並添加新的replaceAll()方法。

public void replaceAll(Collection items){ 
int itemsCount = items.size(); 
if (itemsCount == 0){ 
    return; 
} 
mItems.clear(); 
mItems.addAll(index, items); 
notifyItemRangeChanged(0, itemsCount); 
} 

完整的源:link

+0

感謝分享! – tmm1

3

這將刷新數據,而不會丟失當前位置:

for (int i = 0; i < mAdapter.size(); i++) { 
    ListRow listRow = ((ListRow) mAdapter.get(i)); 
    ArrayObjectAdapter listRowAdapter = ((ArrayObjectAdapter) listRow.getAdapter()); 
    if (listRowAdapter.size() > 0) { 
     listRowAdapter.notifyArrayItemRangeChanged(0, listRowAdapter.size()); 
    } 
} 
0

這裏是我的@ ewilly的回答科特林版本,只有實現replaceAll,我用這兩個最初填充並逐步更新列表。

class RefreshableArrayObjectAdapter(presenter: Presenter): ObjectAdapter(presenter) { 
    var items: ArrayList<Any> = arrayListOf() 

    override fun isImmediateNotifySupported(): Boolean = true 

    override fun size(): Int = items.size 

    override fun get(position: Int): Any = items[position] 

    fun replaceAll(list: Collection<Any>) { 
     items.clear() 
     items.addAll(0, list) 
     notifyChanged() 
    } 
} 
0
/** 
* Notify that the content of a range of items changed. Note that this is 
* not same as items being added or removed. 
* 
* @param positionStart The position of first item that has changed. 
* @param itemCount The count of how many items have changed. 
*/ 
public void notifyArrayItemRangeChanged(int positionStart, int itemCount) { 
    notifyItemRangeChanged(positionStart, itemCount); 
} 

通知的各類物品的內容發生變化。請注意,這是 *與正在添加或刪除的項目不同。

,如果你想添加或刪除的項目,請嘗試this

1.mRowsAdapter.clear(); 
2.mRowsApdapter.addAll(); 
相關問題