Android/SharedPreferences

[Android] SharedPreferences로 검색 리스트 만들기

O_Gyong 2022. 11. 21.
 

[Android] SharedPreferences에 ArrayList로 저장하기

안드로이드에서 가벼운 데이터를 저장하기 위해 SharedPreferences를 사용하곤 한다. ShardPreferences는 key-value 형태로 기기에 데이터를 저장된다. value에는 String, Int, Boolean과 같은 자료형들을 담을 수

ogyong.tistory.com

저번에 SharedPreferences에 ArrayList로 저장하는 것을 해봤는데, 이것을 활용해서 검색 리스트를 만들어보려고 한다.

 

검색 리스트는 RecyclerView로 표현할 거고, 검색 완료를 했을 때 Adapter에 있는 리스트를 갱신할 것이다.


Adapter 작업

class SearchListAdapter: RecyclerView.Adapter<SearchListAdapter.ViewHolder>() {
    private var itemList: ArrayList<PrefData> = arrayListOf()

    inner class ViewHolder(private val mBinding: ItemSearchBinding) : RecyclerView.ViewHolder(mBinding.root) {
        fun bind(mItem: PrefData) {
            mBinding.tvSearchText.text = mItem.text
            mBinding.tvSearchDate.text = mItem.date
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ItemSearchBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )

        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(itemList[position])
    }

    override fun getItemCount(): Int {
        return itemList.size
    }

    fun setList(pList: ArrayList<PrefData>) {
        itemList = pList
        notifyItemRangeChanged(0, itemList.size)
    }
}

 

초기에 itemList를 빈 리스트로 두고 Activity에서 setList에 값이 전달되면

notifyItemRangeChanged를 통해서 RecyclerView를 업데이트한다.


Activity에서 Adapter에 리스트 넘겨주기

mAdapter.setList(arrayListPrefs) // Adapter에 데이터 넘김

앱이 실행되고 onCreate에서 SharedPreferences에 데이터가 있는지 확인하여 리스트를 넘겨준다.

 

데이터가 없을 경우에 빈 화면으로 보이기가 싫다면 visible과 gone을 적절히 사용해서

"검색 이력이 없습니다." 등의 텍스트로 표시하거나 이미지를 노출하는 등의 처리를 하면 될 것 같다.

 

앱 실행 이후에는 EditText에서 검색 완료 이벤트가 발생하면 Adapter에 리스트를 넘겨준다.

(검색 이후 EditText에 텍스트가 남지 않도록 클리어 처리를 했다.)


EditText에서 검색 완료 이벤트가 발생했을 때 리스트가 쌓이고,

앱을 종료하고 재실행했을 때 검색했던 리스트가 잘 표시되는 것을 확인할 수 있다.

 

만약 검색 리스트에서 항목을 삭제하고 싶다면 ArrayList의 removeAt이나 removeAll을 사용하고,

적절한 notifyChanged를 통해 RecyclerView를 업데이트하면 된다.

 

전체 코드

댓글