#android #mvvm #android-recyclerview #viewmodel
Вопрос:
Я пытаюсь реализовать функцию поиска в своем окне просмотра вторсырья, используя room и viewmodel.
Функциональность отлично работает во время поиска. Однако, если я опустошу строку поиска, recyclerview не будет прокручиваться до верхней части полного списка.
Ниже кода:
Модель представления
@HiltViewModel
class MyViewModel @Inject constructor(repository: MyRepository) :
ViewModel() {
private var nameFilter = MutableLiveData<String>("")
val allPosts : LiveData<List<Post>> = Transformations.switchMap(nameFilter) { name ->
if (name.isEmpty()) {
repository.getAllPosts()
} else {
repository.getPostByName(name)
}
}
fun getPostByName(name: String) {
nameFilter.postValue(name)
}
}
Фрагмент
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val listAdapter = MyListAdapter()
binding.RV.apply {
adapter = listAdapter
layoutManager = GridLayoutManager(context, 2)
// Just for spacing
addItemDecoration(RecyclerViewCustomItemDecorator(8, 8))
}
binding.searchRV.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(editable: Editable?) {
viewModel.getPostByName(editable.toString())
}
})
viewModel.allPosts.observe(viewLifecycleOwner) {
listAdapter.submitList(it)
}
}
Адаптер Recyclerview реализует логику DiffUtil.
Надеюсь, кто-нибудь сможет помочь! Спасибо
Ответ №1:
В представлении recycler есть свойство для прокрутки сверху, когда пользователь находится внизу прокрутки mRecyclerView.smoothScrollToPosition(0);
Справка по плавной прокрутке для плавной прокрутки сверху вы также можете использовать mRecyclerView.LayoutManager?.scrollToPosition(0)
Если мы используем вид прокрутки, то используйте
ScrollView.fullScroll(просмотр прокрутки.FOCUS_UP);.
Комментарии:
1. Я испробовал оба ваших подхода. Тем не менее, smoothScrollToPosition(0) работает, это может занять много времени, и это выглядит некрасиво. Положение прокрутки(0) не прокручивается до самого верха