Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GoogleI/Oアプリのようなフィルター機能を実装する

umechanhika
December 13, 2018

 GoogleI/Oアプリのようなフィルター機能を実装する

自作アプリにてリスト表示しているデータをタグによってフィルタリングする機能を作りました。
スライド内で説明しているアプリはこちらになります。
https://play.google.com/store/apps/details?id=com.umehika.happinessbank&hl=ja

umechanhika

December 13, 2018
Tweet

More Decks by umechanhika

Other Decks in Programming

Transcript

  1. ⾃⼰紹介 š 梅津 光(ウメツ ヒカル) š 株式会社ナビタイムジャパン 新卒⼊社 2016~ š

    Androidアプリ開発 バスNAVITIME 法⼈系アプリ š 趣味 個⼈アプリ開発 最近3つ⽬のアプリをリリースしました︕ Work Private
  2. ViewModelのプロパティ class FilterViewModel(useCase: UseCase) : ViewModel() { // 今回はMaterialComponentのChipを⽤いてタグ選択を⾏わせたいので、 //

    選択されたChipの位置からタグを取得するために全てのタグを持っておきます private val allTags: List<String> = useCase.getAllTag() // 選択状態を変更するためのMutableLiveData private val _selectedTags: MutableLiveData<MutableList<String>> = MutableLiveData<MutableList<String>>().apply { value = mutableListOf() } // 変更を通知するためのpublicなLiveData val selectedTags: LiveData<List<String>> = Transformations.map(_selectedTags) { it.toList() } }
  3. ViewModelのメソッド class FilterViewModel(useCase: UseCase) : ViewModel() { // Chipを選択すると位置とチェック状態が渡ってくる fun

    onCheckedChanged(index: Int, isChecked: Boolean) = if (isChecked) { val selectedTags = _selectedTags.value selectedTags.add(allTags[index]) _selectedTags.value = selectedTags } else { val selectedTags = _selectedTags.value selectedTags.remove(allTags[index]) _selectedTags.value = selectedTags } }
  4. Fragment, BottomSheetのコード // Fragment, BottomSheet両者で同じインスタンスを取得可能 viewModel = ViewModelProviders.of(targetFragment, object :

    ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun <T : ViewModel?> create(modelClass: Class<T>): T = FilterViewModel(useCase) as T }) .get(FilterViewModel::class.java) viewModel.selectedTags.observe(this, Observer { // 通知された選択されたタグでリストをフィルタリング adapter.items = filter(it) })