如何使用 kotlin 删除 view-pager 2 中的项目?
How to remove an item in view-pager 2 with kotlin?
我使用 view-pager2 并且当我删除 view-pager 的第一项时,它不会删除并且仍然存在但删除了另一项。
例如,这里我想删除视图寻呼机的第一项,但它没有被删除:
我的主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就够了this answer.
你能帮帮我吗?!
实际上删除功能正常工作第 0 个索引片段被删除,但在调用 notfiydataset 更改后第一个片段获得的值为 1,第二个为 2。
如果你阅读了它所说的文档
Note: The DiffUtil utility class relies on identifying items by ID. If you are using ViewPager2 to page through a mutable collection, you must also override getItemId() and containsItem().
取自此 post - Migrate to ViewPager2
由于您使用的是可变 ArrayList()
,因此您还应该重写适配器中的 getItemId()
方法,因为 itemId
您需要为每个片段设置一个唯一 ID,我解决了它像这样使用 hashCode()
函数
override fun getItemId(position: Int): Long {
return mFragmentList[position].hashCode().toLong()
}
这应该删除第一个片段并使用 itemId
从列表中获取正确的片段
希望这能解决您的问题。
我用 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);
}
我使用 view-pager2 并且当我删除 view-pager 的第一项时,它不会删除并且仍然存在但删除了另一项。
例如,这里我想删除视图寻呼机的第一项,但它没有被删除:
我的主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就够了this answer.
你能帮帮我吗?!
实际上删除功能正常工作第 0 个索引片段被删除,但在调用 notfiydataset 更改后第一个片段获得的值为 1,第二个为 2。
如果你阅读了它所说的文档
Note: The DiffUtil utility class relies on identifying items by ID. If you are using ViewPager2 to page through a mutable collection, you must also override getItemId() and containsItem().
取自此 post - Migrate to ViewPager2
由于您使用的是可变 ArrayList()
,因此您还应该重写适配器中的 getItemId()
方法,因为 itemId
您需要为每个片段设置一个唯一 ID,我解决了它像这样使用 hashCode()
函数
override fun getItemId(position: Int): Long {
return mFragmentList[position].hashCode().toLong()
}
这应该删除第一个片段并使用 itemId
从列表中获取正确的片段
希望这能解决您的问题。
我用 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);
}