Помогите найти индекс последнего добавленного элемента в RecyclerView после его сортировки, для того чтобы произвести ScrollToPosition
Помогите пожалуйста со ScrollToPosition. Сразу поясню скролить в начало или конец RecyclerView я знаю как. Мне нужно скролить именно к только что добавленному элементу. Добавление элемента происходит в базу данных и так же сортируется от наименьшего числа к большему в adaptere. Добавление элемента может быть как в начало, конец а так же в середину списка RecyclerView.
AdapterLimitationsChet.kt
class AdapterLimitationsChet(listMain: ArrayList<ListItemLimitationsChet>, private var listLimitationsFragmentChet: ListLimitationsFragmentChet) : RecyclerView.Adapter<AdapterLimitationsChet.MyViewHolder>() {
private var listArray = listMain
private val diffUtilCallback : DiffUtil.ItemCallback<ListItemLimitationsChet> = object : DiffUtil.ItemCallback<ListItemLimitationsChet>() {
override fun areItemsTheSame(
oldItem: ListItemLimitationsChet,
newItem: ListItemLimitationsChet
): Boolean {
return oldItem === newItem
}
@SuppressLint("DiffUtilEquals")
override fun areContentsTheSame(
oldItem: ListItemLimitationsChet,
newItem: ListItemLimitationsChet
): Boolean {
return oldItem == newItem
}
}
private val asyncListDiffer = AsyncListDiffer(this, diffUtilCallback)
inner class MyViewHolder(view: View, context: ListLimitationsFragmentChet) : RecyclerView.ViewHolder(view) {
private val binding = ItemLimitationsChetBinding.bind(view)
@SuppressLint("UseKtx")
fun setData(item: ListItemLimitationsChet) = with(binding){
kmStartItemLimitationsChet.text = item.startChet.toString()
pkStartItemLimitationsChet.text = item.picketStartChet.toString()
kmFinishItemLimitationsChet.text = item.finishChet.toString()
pkFinishItemLimitationsChet.text = item.picketFinishChet.toString()
speedItemLimitationsChet.text = item.speedChet.toString()
limitationCheckChetItem.text = item.switchChetAdd.toString()
if (limitationCheckChetItem.text == "1") {
idItemLayoutLimitationsChet.setCardBackgroundColor(Color.parseColor(
PreferenceManager.getDefaultSharedPreferences(itemView.context)
.getString("color_limitation_time_key", "#FF009EDA")))
} else {
idItemLayoutLimitationsChet.setCardBackgroundColor(Color.parseColor(
PreferenceManager.getDefaultSharedPreferences(itemView.context)
.getString("color_limitation_key", "#FF009EDA")))
}
idItemLayoutLimitationsChet.setOnClickListener {
val action = ListLimitationsFragmentChetDirections.actionListLimitationsFragmentChetToUpdateLimitationsFragmentChet(item)
idItemLayoutLimitationsChet.findNavController().navigate(action)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val inflater = LayoutInflater.from(parent.context)
return MyViewHolder(inflater.inflate(R.layout.item_limitations_chet, parent, false), listLimitationsFragmentChet)
}
override fun getItemCount(): Int {
return listArray.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.setData(listArray[position])
}
@SuppressLint("NotifyDataSetChanged")
fun updateLimitationsChet(listItems: List<ListItemLimitationsChet>){
listArray.clear()
listArray.addAll(listItems)
listArray.sortBy { it.speedChet }
listArray.sortBy { it.picketStartChet }
listArray.sortBy { it.startChet }
// notifyDataSetChanged()
asyncListDiffer.submitList(listItems)
}
fun removeItemLimitationsChet(pos: Int, dbManagerLimitations: MyDbManagerLimitations){
dbManagerLimitations.deleteDbDataLimitationsChet(listArray[pos].idChet)
listArray.removeAt(pos)
notifyItemRangeChanged(0, listArray.size)
notifyItemRemoved(pos)
}
}
ListLimitationsFragmentChet.kt
class ListLimitationsFragmentChet : Fragment() {
private lateinit var binding: FragmentListLimitationsChetBinding
private lateinit var myDbManagerLimitations: MyDbManagerLimitations
private val adapterLimitationsChet = AdapterLimitationsChet(ArrayList(), this)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
binding = FragmentListLimitationsChetBinding.inflate(inflater, container, false)
binding.fbAddLimitationsChet.setOnClickListener {
findNavController().navigate(R.id.action_listLimitationsFragmentChet_to_addLimitationsFragmentChet)
}
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
init(view)
}
override fun onResume() {
super.onResume()
myDbManagerLimitations.openDb()
fillAdapter()
}
private fun init(v: View) = with(binding) {
myDbManagerLimitations = MyDbManagerLimitations(v.context)
rcLimitationsChet.layoutManager = LinearLayoutManager(requireContext())
val swapHelper = getSwapMg()
swapHelper.attachToRecyclerView(rcLimitationsChet)
rcLimitationsChet.adapter = adapterLimitationsChet
}
private fun fillAdapter() {
CoroutineScope(Dispatchers.Main).launch {
adapterLimitationsChet.updateLimitationsChet(myDbManagerLimitations.readDbDataLimitationsChet())
}
}
override fun onDestroy() {
super.onDestroy()
myDbManagerLimitations.closeDb()
}
private fun getSwapMg() : ItemTouchHelper{
return ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT or ItemTouchHelper.LEFT){
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder,
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
adapterLimitationsChet.removeItemLimitationsChet(viewHolder.adapterPosition, myDbManagerLimitations)
}
})
}
companion object {
@JvmStatic
fun newInstance() = ListLimitationsFragmentChet()
}
}