8

我想重新加载浏览片段中的一些行数据。

基本上我想重置适配器数据,而不会在浏览片段中造成类似闪光的效果。知道怎么做吗?

类似于notifyDataSetChanged()列表视图中的内容。

谢谢

4

5 回答 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());
    }
}
于 2017-01-03T13:28:51.870 回答
1

我在这个问题中回答了类似的问题: Dynamicly 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));

当然,这可能仅适用于您第一次创建 UI。未来的时代可能不会这样做。在我的应用程序CumulusTV中,我创建了一个方法,每次我想对应用程序进行完全重绘时都会调用该方法:

public void refreshUI() {
    prepareBackgroundManager();
    setupUIElements();
    loadRows(); //Generate and populate all the rows
    setupEventListeners();
}
于 2015-11-23T18:24:12.420 回答
1

您可以创建自己的适配器并添加新的 replaceAll() 方法。

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

完整来源:链接

于 2016-07-27T17:59:27.077 回答
0

这是我的@ewilly 答案的kotlin 版本,仅实现了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()
    }
}
于 2017-06-13T01:17:53.880 回答
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);
}

通知一系列项目的内容发生了变化。请注意,这与添加或删除的项目不同。

如果你想添加或删除项目,请试试这个

1.mRowsAdapter.clear();
2.mRowsApdapter.addAll();
于 2017-12-25T03:59:52.407 回答