簡體   English   中英

如何使用 kotlin 刪除 view-pager 2 中的項目?

[英]How to remove an item in view-pager 2 with kotlin?

我使用 view-pager2 並且當我刪除 view-pager 的第一項時,它不會刪除並且仍然存在但刪除了另一項。

例如,在這里我想刪除視圖尋呼機的第一項,但它沒有被刪除:

屏幕記錄

我的主要活動:

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 即可

你能幫助我嗎?!

如果您閱讀它說的文檔

注意:DiffUtil 實用程序 class 依賴於通過 ID 識別項目。 如果您使用 ViewPager2 對可變集合進行分頁,則還必須覆蓋 getItemId() 和 containsItem()。

取自這篇文章 - 遷移到 ViewPager2

由於您使用的是可變ArrayList()您還應該覆蓋適配器中的getItemId()方法,對於itemId您需要每個片段的唯一 ID,我使用hashCode() function 解決了這個問題

 override fun getItemId(position: Int): Long {
        return mFragmentList[position].hashCode().toLong()
    } 

這應該刪除第一個片段並使用itemId從列表中獲取正確的片段希望這可以解決您的問題。

實際上刪除功能正常工作第 0 個索引片段被刪除,但在調用 notfiydataset 更改后,第一個片段的值為 1,第二個為 2。

我對 java 和 viewpager2 及其作品做了同樣的事情!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM