본문 바로가기

앱 개발/Kotlin_Android

검색 결과 화면을 유지하기

1) ViewModel을 사용한 데이터 유지
ViewModel은 안드로이드 아키텍처 컴포넌트의 일부로서 화면 회전과 같은 구성 변경에도 데이터를 유지한다.

SearchViewModel.kt

class SearchViewModel : ViewModel() {
    private val _searchResults = MutableLiveData<List<VideoItem>>()
    val searchResults: LiveData<List<VideoItem>> get() = _searchResults

    fun updateSearchResults(results: List<VideoItem>) {
        _searchResults.value = results
    }
}


2) Fragment에서 ViewModel을 사용하여 데이터 유지
ViewModel을 사용하여 데이터 변경 시점을 관리하고, 프래그먼트 전환 시에도 데이터를 유지할 수 있다.

SearchFragment.kt

class SearchFragment : Fragment() {
    private val searchViewModel: SearchViewModel by activityViewModels()
    private lateinit var searchAdapter: SearchAdapter

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding = FragmentSearchBinding.inflate(inflater, container, false)
        searchAdapter = SearchAdapter()

        binding.recyclerView.apply {
            layoutManager = LinearLayoutManager(context)
            adapter = searchAdapter
        }

        searchViewModel.searchResults.observe(viewLifecycleOwner, Observer { results ->
            searchAdapter.submitList(results)
        })

        return binding.root
    }
}


3) ViewModel에서 데이터 업데이트
검색 버튼 클릭 시 데이터를 ViewModel에 업데이트한다.

SomeFragment.kt

class SomeFragment : Fragment() {
    private val searchViewModel: SearchViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.searchButton.setOnClickListener {
            performSearch(binding.searchQuery.text.toString())
        }
    }

    private fun performSearch(query: String) {
        // Call your API and get the search results
        val searchResults = getSearchResults(query)
        searchViewModel.updateSearchResults(searchResults)
    }

    private fun getSearchResults(query: String): List<VideoItem> {
        // Perform API call and return the results
        return listOf()
    }
}


4) Navigation Component 설정
Navigation Component를 사용하여 프래그먼트 전환을 관리한다. 프래그먼트를 다시 생성하더라도 ViewModel의 데이터를 유지할 수 있다.

nav_graph.xml
<fragment
    android:id="@+id/searchFragment"
    tools:layout="@layout/fragment_search">
    <action
        android:id="@+id/action_homeFragment_to_searchFragment"
        app:destination="@id/searchFragment" />
</fragment>


5) HomeFragment에서 검색 화면으로 이동
홈 화면에서 검색 화면으로 이동할 때 Navigation Component를 사용하여 전환한다.

HomeFragment.kt

class HomeFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding = FragmentHomeBinding.inflate(inflater, container, false)

        binding.searchButton.setOnClickListener {
            findNavController().navigate(R.id.action_homeFragment_to_searchFragment)
        }

        return binding.root
    }
}

728x90

'앱 개발 > Kotlin_Android' 카테고리의 다른 글

DTO, DTA, Entity  (0) 2024.06.21
무한 스크롤 기능 구현  (0) 2024.06.19
Process, Thread  (0) 2024.06.13
MVVM 패턴 사용 이유  (0) 2024.06.11
Android 4대 컴포넌트  (0) 2024.06.07