我想重新加載瀏覽片段中的一些行數據。基本上我想重置適配器數據,而不會在瀏覽片段中導致類似Flash的效果。任何想法如何實現類似於列表視圖中的notifyDataSetChanged()。android tv - 加載適配器數據
感謝名單
我想重新加載瀏覽片段中的一些行數據。基本上我想重置適配器數據,而不會在瀏覽片段中導致類似Flash的效果。任何想法如何實現類似於列表視圖中的notifyDataSetChanged()。android tv - 加載適配器數據
感謝名單
我回答這個問題,類似的東西: 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();
}
您的鏈接已損壞,您可以再發布一次嗎? – joe
自從我最初發布答案以來,我對代碼庫做了很多更改。我回顧了提交歷史記錄,並在回答時更新了URL以指向該文件。 –
這將刷新數據,而不會丟失當前位置:
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());
}
}
這裏是我的@ 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()
}
}
/**
* 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();
只是用adapter.add(項目)增加值到適配器。在添加到現有值的情況下,或者執行adapter.clear()和添加。 – Dhina