I have isolated the code to show this problem.
I have a recyclerview inside a fragment. I also have LiveData and MutableLiveData.
In the ViewModel.kt code there are these two lines in this order and it works fine:
private val mMLD = MutableLiveData<OneLine>()
var mLD : LiveData<OneLine> = getMLD()
If I reverse the order, ie
var mLD : LiveData<OneLine> = getMLD()
private val mMLD = MutableLiveData<OneLine>()
the program crashes.
Is this a bug?
I am using Android Studio Chipmunk 2021.2.1
Here is my code:
class Adapter(private var mList: List<OneLine>) : RecyclerView.Adapter<Adapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.one_line, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val DisplayViewModel = mList.get(position)
holder.textView.text = DisplayViewModel.text
}
override fun getItemCount(): Int {
return mList.size
}
class ViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView) {
val textView: TextView = itemView.findViewById(R.id.textView)
}
}
class Fragment : Fragment() {
private lateinit var adapter : Adapter
private lateinit var viewModel: ViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view: View = inflater.inflate(R.layout.fragment, container, false)
viewModel = ViewModelProvider(requireActivity()).get(ViewModel::class.java)
viewModel.Initialize()
enableRecyclerView(view)
viewModel.mLD.observe(viewLifecycleOwner, Observer {
adapter.notifyDataSetChanged()
})
return view
}
fun enableRecyclerView(view:View){
var mRecyclerView: RecyclerView? = null
mRecyclerView = view.findViewById(R.id.recycler_view)
val linearLayoutManager = LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)
mRecyclerView.layoutManager = linearLayoutManager
adapter = Adapter(viewModel.rvData) // This will pass the ArrayList to our Adapter
mRecyclerView.adapter = adapter
}
}
class MainActivity : AppCompatActivity() {
private lateinit var operator_display: ViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
data class OneLine(val text: String) {
}
class ViewModel : ViewModel(){
var mLD : LiveData<OneLine> = getMLD() // observer watches this variable
private val mMLD = MutableLiveData<OneLine>()
private fun getMLD():MutableLiveData<OneLine>{return mMLD}
var rvData = ArrayList<OneLine>()
fun Initialize(){
rvData.add(OneLine("Item A"))
rvData.add(OneLine("Item B"))
rvData.add(OneLine("Item C"))
}
}