如何使用 Kotlin 从视图翻页器 (view-pager 2) 中删除项目?

3

我使用view-pager2,当我删除第一个项目时,它并没有被删除而是仍然存在,但另一个项目被删除了。

例如,这里我想要移除view pager的第一个项目,但它没有被移除:

screen record

我的主Activity:

class MainActivity : AppCompatActivity() {

private lateinit var myPagerAdapter: MyPagerAdapter
private val mFragmentList: ArrayList<FragmentOne> = ArrayList()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    if (mFragmentList.isEmpty()) {
        mFragmentList.add(FragmentOne.newInstance(1))
        mFragmentList.add(FragmentOne.newInstance(2))
        mFragmentList.add(FragmentOne.newInstance(3))
    }

    myPagerAdapter = MyPagerAdapter(supportFragmentManager, lifecycle)
    view_pager.adapter = myPagerAdapter

    btn_show.setOnClickListener {
        val dialog = Dialog(this)
        dialog.setContentView(R.layout.fragment_dialog)
        dialog.btn_remove.setOnClickListener {
            //go to next item
            view_pager.currentItem = 1
            //remove first item
            mFragmentList.removeAt(0)
            //reload adapter
            myPagerAdapter.notifyDataSetChanged()
        }
        dialog.show()
    }

}

private inner class MyPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
    FragmentStateAdapter(fragmentManager, lifecycle) {

    override fun getItemCount(): Int {
        return mFragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return mFragmentList[position]
    }

}
}

片段一:

class FragmentOne : Fragment() {

companion object {
    fun newInstance(position: Int): FragmentOne {
        val fragment = FragmentOne()
        val bundle = Bundle()
        bundle.putInt("id", position)
        fragment.arguments = bundle
        return fragment
    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_one, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val id = arguments?.getInt("id")
    tv?.text = id.toString()
}

}

如果我不使用view-pager2,只需要像这个答案一样添加PagerAdapter.POSITION_NONE即可。

你能帮我吗?!


你能也发布一下你的Fragment吗? - Skizo-ozᴉʞS ツ
@Skizo-ozᴉʞS已添加。 - Marlen Schreiner
3个回答

2
如果您阅读文档,它会说:
注意:DiffUtil 工具类依赖于通过 ID 标识项目。 如果您使用 ViewPager2 浏览可变集合,则还必须重写 getItemId() 和 containsItem()。
取自此帖子 - 迁移到 ViewPager2 由于您正在使用可变的 ArrayList(),因此还应在适配器中重写 getItemId() 方法,对于 itemId,您需要一个唯一的 ID 用于每个片段,我使用 hashCode() 函数解决了这个问题,如下所示。
 override fun getItemId(position: Int): Long {
        return mFragmentList[position].hashCode().toLong()
    } 

这应该会删除第一个片段,并使用itemId从列表中获取正确的片段。希望这解决了你的问题。

0

我也用viewpager2在Java中实现了同样的功能,而且它很好用!

@Override
public long getItemId(int position) {
    Long longtype = Long.valueOf(mFragmentList.get(position).hashCode());
    return longtype;
}

@Override
public boolean containsItem(long itemId) {
    return super.containsItem(itemId);
}

2
问题明确要求提供 kotlin 代码。 - Abhishek Dutt

0

实际上删除功能正常工作,第0个索引片段被删除,但在调用notifydataset changed之后,第一个片段的值变为1,第二个片段的值变为2。


为什么?我没有将片段再次添加到ArrayList中。值保存在片段的_newInstance_方法中,且不会更改。 - Marlen Schreiner

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