【问题标题】:android tv -Reloading adapter dataandroid tv - 重新加载适配器数据
【发布时间】:2016-02-25 12:02:19
【问题描述】:

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

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

列表视图中类似于notifyDataSetChanged()

感谢

【问题讨论】:

  • 只需使用 adapter.add(item) 将值添加到适配器。如果您要添加到现有值或执行 adapter.clear() 和 add.

标签: android-tv leanback


【解决方案1】:

这将在不丢失当前位置的情况下刷新数据:

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

【讨论】:

    【解决方案2】:

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

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

    完整来源:link

    【讨论】:

    • 感谢分享!
    【解决方案3】:

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

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

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

    【讨论】:

    • 你的链接失效了,能再发一次吗?
    • 自从我最初发布答案以来,我对代码库进行了许多更改。我回顾了提交历史并更新了 URL 以在回答时指向文件。
    【解决方案4】:

    这是我的 @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()
        }
    }
    

    【讨论】:

      【解决方案5】:
        /**
       * 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();
      

      【讨论】:

        猜你喜欢
        • 2015-06-24
        • 2017-03-09
        • 2020-09-13
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多