Поиск Recyclerview — прокрутите вверх, когда поиск пуст

#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) не прокручивается до самого верха