[我正在尝试使用MVVM模式从Firebase Firestore检索数据。每次构建都会成功,但是应用无法打开。我无法在代码中找到错误。应用程序可以添加数据,但要检索数据是问题。请帮助。谢谢]]
ViewModel
import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.google.firebase.firestore.FirebaseFirestore import com.karuneshpalekar.firestorepagination.models.Note import java.lang.Exception class DataViewModel : ViewModel() { companion object{ private const val TAG =" VIEWMODEL" } private val db = FirebaseFirestore.getInstance() private val noteref = db.collection("record") private val _results = MutableLiveData<Exception>() val results: LiveData<Exception> get() = _results private val _notes = MutableLiveData<List<Note>>() val notes: LiveData<List<Note>> get() = _notes fun addData(note: Note) { noteref.add(note).addOnCompleteListener { if (it.isSuccessful) { Log.w("TAG", "success") _results.value = null } else { _results.value = it.exception } } } fun fetchData() { noteref.addSnapshotListener{ snapshot,e-> if (e!=null){ Log.w(TAG,"Listen failed",e) return@addSnapshotListener } if (snapshot != null) { val items = mutableListOf<Note>() for (docs in snapshot){ val notes = docs.toObject(Note::class.java) notes.let { items.add(it) } _notes.value = items } } } } }
适配器
import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.karuneshpalekar.firestorepagination.R import com.karuneshpalekar.firestorepagination.models.Note import kotlinx.android.synthetic.main.list_item.view.* class DataAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() { private var items= mutableListOf<Note>() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return DataViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false) ) } override fun getItemCount(): Int { return items.size } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is DataViewHolder -> { holder.bind(items[position]) } } } fun setNote(items:List<Note>){ this.items = items as MutableList<Note> notifyDataSetChanged() } class DataViewHolder constructor(itemView: View) : RecyclerView.ViewHolder(itemView) { private val textName = itemView.text_view_name fun bind(note: Note) { textName.text = note.name } } }
片段
import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import com.karuneshpalekar.firestorepagination.R import kotlinx.android.synthetic.main.fragment_recyclerview.* class RecyclerView : Fragment() { private lateinit var viewModel: DataViewModel private lateinit var dataadapter : DataAdapter override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment viewModel = ViewModelProviders.of(this).get(DataViewModel::class.java) return inflater.inflate(R.layout.fragment_recyclerview, container, false) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) recycler_view.apply { dataadapter = DataAdapter() adapter = dataadapter } viewModel.fetchData() viewModel.notes.observe(viewLifecycleOwner, Observer { dataadapter.setNote(it) }) floating_btn_add.setOnClickListener { DialogFragment().show(childFragmentManager, "") } } }
DialogFragment-添加数据
class DialogFragment :DialogFragment(){ private lateinit var viewmodel:DataViewModel override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { viewmodel = ViewModelProviders.of(this).get(DataViewModel::class.java) return inflater.inflate(R.layout.fragment_dialog, container, false) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setStyle(STYLE_NO_TITLE, android.R.style.Theme_DeviceDefault_Light_Dialog_MinWidth) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewmodel.results.observe(viewLifecycleOwner, Observer { val message = if (it == null) { getString(R.string.name_added) } else { getString(R.string.name_error) } Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() dismiss() }) button_add.setOnClickListener { val names = edit_text_name.text.toString().trim() val note= Note("",names) viewmodel.addData(note) } } }
RecyclerView XML
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".ui.RecyclerView"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="@dimen/margin" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/list_item" /> <com.google.android.material.floatingactionbutton.FloatingActionButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/floating_btn_add" app:fabSize="normal" android:layout_gravity="bottom|end" android:layout_margin="@dimen/margin" /> </androidx.coordinatorlayout.widget.CoordinatorLayout>
以上是我的项目的代码
[我正在尝试使用MVVM模式从Firebase Firestore检索数据。每次构建都会成功,但是应用无法打开。我无法在代码中找到错误。...
提供错误的代码中唯一缺少的是在Model类(即Note类)中没有进行空检查。