How to databind to onTextChanged for an EditText on Android?

后端 未结 9 1179
悲哀的现实
悲哀的现实 2020-11-30 01:41

In Yigit Boyar and George Mount\'s talk on Android Databinding they illustrate how easy it is to bind to TextWatcher\'s onTextChanged (at 13:41). O

9条回答
  •  庸人自扰
    2020-11-30 02:20

    I got it working like this:

    Fragment:

        class DiAtomicMoleculesFragment : Fragment() {
            private lateinit var binding: FragmentDiatomicMoleculesBinding
    
            override fun onCreateView(
                inflater: LayoutInflater,
                container: ViewGroup?,
                savedInstanceState: Bundle?
            ): View? {
                binding = FragmentDiatomicMoleculesBinding.inflate(layoutInflater, container, false)
                return binding.root
            }
    
            override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
                super.onViewCreated(view, savedInstanceState)
                val recyclerAdapter = DiAtomicMoleculesAdapter(onClickListener)
    
                binding.diRecyclerView.apply {
                    setHasFixedSize(true)
                    layoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)
                    adapter = recyclerAdapter
                }
    
                val viewModel = ViewModelProvider(this).get(DiAtomicMoleculesViewModel::class.java)
                viewModel.getDiAtomicMolecules().observe(viewLifecycleOwner, Observer { items ->
                    recyclerAdapter.setData(items)
                })
    
                viewModel.getDiAtomicMoleculesByName().observe(viewLifecycleOwner, Observer { items ->
                    recyclerAdapter.setData(items)
                })
    
                //this is important
                binding.viewModel = viewModel
            }
        }
    

    layout.xml:

    
    
    
        
            
        
    
        
    
            
    
    
    
            
    
        
    
    

    ViewModel:

    class DiAtomicMoleculesViewModel : ViewModel() {
        private val allLiveData = AppDatabase.getInstance().getDiAtomicMoleculeDao().getAll()
        private val filterLiveData = MutableLiveData()
        private val searchByLiveData = Transformations.switchMap(filterLiveData, ::filter)
    
        fun getDiAtomicMolecules(): LiveData> {
            return allLiveData
        }
    
        private fun filter(text: String): LiveData> {
            return AppDatabase.getInstance().getDiAtomicMoleculeDao().find(text)
        }
    
        fun getDiAtomicMoleculesByName(): LiveData> {
            return searchByLiveData
        }
    
        fun onTextChange(e: Editable?) {
            filterLiveData.value = e?.toString()
        }
    
        fun onTextChange(text: CharSequence?) {
            filterLiveData.value = text?.toString()
        }
    }
    

提交回复
热议问题