【问题标题】:What is purpose of overriding `containsItem` and `getItemId` in `FragmentStateAdapter`?在`FragmentStateAdapter`中覆盖`containsItem`和`getItemId`的目的是什么?
【发布时间】:2021-07-14 17:48:14
【问题描述】:

在FragmentStateAdapter 中覆盖containsItem 和getItemId 的目的是什么?

如果将新列表传递给FragmentStatePagerAdapter 实现并调用notifyDataSetChanged,是否需要这些覆盖?

从文档中,如果基础数据集正在更改,则似乎需要两个覆盖,并且您需要调用 notifyDataSetChanged?

/**
 * Default implementation works for collections that don't add, move, remove items.
 * <p>
 * TODO(b/122670460): add lint rule
 * When overriding, also override {@link #getItemId(int)}
 */
public boolean containsItem(long itemId) {
    return itemId >= 0 && itemId < getItemCount();
}

/**
 * Default implementation works for collections that don't add, move, remove items.
 * <p>
 * TODO(b/122670460): add lint rule
 * When overriding, also override {@link #containsItem(long)}.
 * <p>
 * If the item is not a part of the collection, return {@link RecyclerView#NO_ID}.
 *
 * @param position Adapter position
 * @return stable item id {@link RecyclerView.Adapter#hasStableIds()}
 */
@Override
public long getItemId(int position) {
    return position;
}

例如,这是我的实现

class MyAdapter(host : Fragment) : FragmentStateAdapter(host) {

    data class FragItem(val newInstance : () -> Fragment, val fragId : Long)

    private var fragments = mapOf<Integer,FragItem>()

    override fun createFragment(position: Int): Fragment {
        return fragments[position]?.newInstance?.invoke() ?: DefaultFragment()
    }
    
    fun applyDataSet(newFragments : Map<Integer, FragItem>) {
        fragments = newFragments
        notifyDataSetChanged()
    }

    override fun getItemCount() = fragments.size

    override fun containsItem(itemId: Long): Boolean{
        return fragments.any { it.value.fragId == itemId }
    }

    override fun getItemId(position: Int) : Long{
        return fragments.values.elementAt(position).fragId
    }
}

现在我可以摆脱getItemId 和containsItem 了吗?还是离开他们? getItemCount呢?

【问题讨论】:

    标签: android androidx fragmentstateadapter


    【解决方案1】:
    • getItemCount 将指示回收者要渲染多少项目。当前索引将作为position 传递给createFragment,所以显然你需要它
    • getItemId 和 containsItem 如果您想为您的回收商提供稳定的 ID,则实施。拥有稳定的 ID 可以进行某些优化,通常是在涉及对列表中不相邻的元素进行操作时。

    【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2011-10-06
    • 2012-06-09
    • 2011-03-01
    • 1970-01-01
    • 2013-03-17
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多