安卓电视 - 重新加载适配器数据

8
我想在浏览片段中重新加载一些行的数据。基本上,我想在不引起浏览片段闪烁效果的情况下重置适配器数据。有什么想法吗?类似于列表视图中的notifyDataSetChanged()。谢谢。

只需使用adapter.add(item)将值添加到适配器中,如果您要添加到现有值,则使用adapter.clear()和add。 - Dhinakaran Thennarasu
5个回答

5
这将在不丢失当前位置的情况下刷新数据:
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());
    }
}

1

我在这个问题中回答了类似的内容:如何动态添加卡片到 Android TV leanback 的列表行中

我将从那里复制我的答案,希望这能有所帮助。

要向 presenter 添加项目:

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));

当然,这可能仅适用于您第一次创建UI的情况。未来可能不会起作用。在我的应用程序CumulusTV中,我创建了一个方法,每次我想要进行完整的应用程序重绘时都会调用它:
public void refreshUI() {
    prepareBackgroundManager();
    setupUIElements();
    loadRows(); //Generate and populate all the rows
    setupEventListeners();
}

你的链接已经失效了,请再发一遍好吗? - joe
1
自从我最初发布答案以来,我对代码库进行了许多更改。我回顾了提交历史,并更新了URL以指向回答时的文件。 - Nick Felker

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


谢谢分享! - tmm1

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();

0
这是我用 Kotlin 编写的 @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()
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接