Adnroid The adapter of ViewPager2 will automatically move to the next page after updating data using ListAdapter

104 Views Asked by At

When I click the add button, the corresponding list data will be added by one and will be refreshed to the UI. The UI has indeed been refreshed, but after refreshing, viewpager2 will slide to the next page I wrote a simple Viewapger2 for testing, and the code is as follows,Who will tell me how to solve this problem, or has anyone encountered this problem?

MainActivity

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var adapter: BannerAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.lifecycleOwner = this

        initBanner()
    }

    private fun initBanner() {
        adapter = BannerAdapter(object : BannerAdapter.OnItemClickListener {
            override fun onItemClick(position: Int) {
                val list = adapter.currentList.toMutableList()
                list.forEachIndexed { index, bannerData ->
                    if (index == position) {
                        val temp = bannerData.copy()
                        temp.count++
                        list[index] = temp
                    }
                }
                adapter.submitList(list)
            }
        })
        binding.viewPager.adapter = adapter

        val bannerDataList = mutableListOf<BannerData>()
        for (i in 0..10) {
            bannerDataList.add(BannerData("第${i}个", i))
        }
        adapter.submitList(bannerDataList)
    }
}

BannerAdapter

class BannerAdapter(private val itemClickListener: OnItemClickListener) :
    ListAdapter<BannerData, BannerAdapter.ViewHolder>(DiffCallback()) {

    class ViewHolder(
        private val binding: ItemBannerBinding,
        private val itemClickListener: OnItemClickListener
    ) : RecyclerView.ViewHolder(binding.root) {

        init {
            binding.add.setOnClickListener {
                itemClickListener.onItemClick(adapterPosition)
            }
        }

        fun bind(item: BannerData) {
            binding.item = item
            binding.executePendingBindings()
        }

    }

    class DiffCallback : androidx.recyclerview.widget.DiffUtil.ItemCallback<BannerData>() {
        override fun areItemsTheSame(oldItem: BannerData, newItem: BannerData): Boolean {
            return oldItem === newItem
        }

        override fun areContentsTheSame(oldItem: BannerData, newItem: BannerData): Boolean {
            return oldItem == newItem
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            ItemBannerBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            ), itemClickListener
        )
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position))
    }

    interface OnItemClickListener {
        fun onItemClick(position: Int)
    }

}

I tried using binding.viewPage.currentItem = position to control its position, but it didn't work

0

There are 0 best solutions below