Сохранить данные API в базе данных Room в Android - PullRequest
0 голосов
/ 22 января 2019

Я хочу взять данные из API с помощью модернизации и сохранить их в базе данных комнаты.Затем заполнив мой адаптер, я добавил данные в Room, но когда список с данными показывает мне, когда я щелкаю элемент списка пользователей, я щелкаю по X user, и он показывает мне данные для другого пользователя.Я не понял, где моя проблема Вот мой код:

class TutorsFragment : Fragment(), TutorListAdapter.ListItemClickListener, fromBackgroundToMainUIThread {


private var recyclerView: RecyclerView? = null
private var tutorListAdapter: TutorListAdapter? = null
private lateinit var tutors: List<Tutors>
private lateinit var tutorViewModel: StudentTutorViewModel

override fun onTutorsReceived(tutors: List<Tutors>) {
    this.tutors = tutors
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val tutorView = inflater.inflate(R.layout.fragment_tutors, null)

    recyclerView = tutorView.findViewById<View>(R.id.recyclerview_tutors) as RecyclerView
    tutorViewModel = ViewModelProviders.of(this).get(StudentTutorViewModel::class.java)

    val layoutManager = LinearLayoutManager(this.activity, LinearLayoutManager.VERTICAL, false)
    recyclerView!!.layoutManager = layoutManager

    recyclerView!!.setHasFixedSize(true)

    tutorViewModel.getAllTutors().observe(viewLifecycleOwner, Observer {
        if (it != null) {
            tutorListAdapter = TutorListAdapter(it as MutableList<Tutor>?, this@TutorsFragment)
            recyclerView!!.adapter = tutorListAdapter
        }
    })

    val api = RetrofitClient.getInstance().apiService
    val call = api!!.tutorsList

    call.enqueue(object : Callback<List<Tutors>> {
        override fun onResponse(call: Call<List<Tutors>>, response: Response<List<Tutors>>) {

            Log.d("Tutors:  ", response.toString())
            val tutorsList = response.body()

            tutorsList!!.forEach {
                val tutor = Tutor(it.userID!!, it.name!!, it.lastname!!, it.email!!, it.roleFK!!, it.course!!.pathName)
                tutorViewModel.addTutor(tutor)
            }

            if (true) {
                this@TutorsFragment.onTutorsReceived(tutorsList)
            }

        }

        override fun onFailure(call: Call<List<Tutors>>, t: Throwable) {
            Toast.makeText(activity!!.applicationContext, t.message, Toast.LENGTH_SHORT).show()
        }
    })

    }

    val fab = tutorView.findViewById<View>(R.id.fab_tutors) as FloatingActionButton
    fab.setOnClickListener {
        val fragment = AddStudentAndTutorFragment()
        val title = "Add Tutors"
        val fragmentManager = fragmentManager
        val ft = fragmentManager!!.beginTransaction()
        ft.replace(R.id.frame, fragment)
        ft.addToBackStack(null)
        ft.commit()

        (activity as AppCompatActivity).supportActionBar!!.setTitle(title)
    }

    return tutorView
}

override fun onListItemClick(view: View, position: Int) {

    val tutor = tutors[position]
    val fragment = UserDetails()
    val title = "User Details"
    val bundle = Bundle()
    bundle.putString("name", tutor.name)
    bundle.putString("lastname", tutor.lastname)
    bundle.putString("email", tutor.email)
    bundle.putInt("userID", tutor.userID!!)
    bundle.putInt("role", tutor.roleFK!!)
    bundle.putString("course", tutor.course!!.pathName)
    fragment.arguments = bundle

    val fragmentManager = fragmentManager!!
    val ft = fragmentManager.beginTransaction()
    ft.replace(R.id.frame, fragment)
    ft.addToBackStack(null)
    ft.commit()

    (activity as AppCompatActivity).supportActionBar!!.title = title

}

override fun onResume() {
    super.onResume()
    val activity = activity as AppCompatActivity?
    val actionBar = activity!!.supportActionBar
    val my_fragment_title = "Tutors"
    actionBar!!.title = my_fragment_title
}

}

internal interface fromBackgroundToMainUIThread {
fun onTutorsReceived(tutors: List<Tutors>)

}

А вот мой класс адаптера:

class TutorListAdapter(private val tutorsList: MutableList<Tutor>?, private val onItemClickListener: ListItemClickListener) : RecyclerView.Adapter<TutorListAdapter.ListViewHolder>() {

override fun onCreateViewHolder(viewGroup: ViewGroup, viewtype: Int): ListViewHolder {

    return ListViewHolder(viewGroup.inflate(R.layout.list_item))
}

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

@SuppressLint("SetTextI18n")
override fun onBindViewHolder(listViewHolder: ListViewHolder, position: Int) {

    val tutors = tutorsList!![position]
    listViewHolder.listItemTextView.text = tutors.name + "  " + tutors.lastname
}

fun removeItem(position: Int) {
    if (position < 0 || position >= tutorsList!!.size) {
        return
    }

    tutorsList.removeAt(position)
    notifyItemRemoved(position)
    notifyDataSetChanged()

}

interface ListItemClickListener {

    fun onListItemClick(view: View, position: Int)
}

inner class ListViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {
    var listItemTextView: TextView

    init {

        listItemTextView = view.findViewById<View>(R.id.list_item_textview) as TextView
        view.setOnClickListener(this)
    }

    override fun onClick(v: View) {
        onItemClickListener.onListItemClick(v, adapterPosition)
    }
}

}

Класс ViewModel:

class StudentTutorViewModel(application: Application) : AndroidViewModel(application) {

var repository: Repository = Repository(application)

fun addTutor(tutor: Tutor) = repository.addTutor(tutor)

fun getAllTutors() = repository.getTutors()

}

Буду признателен, если кто-нибудь сможет мне помочь

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Я нашел решение Проблема была в том, что в функции onListItemClick я вызываю список, который заполняется из API, а не из комнаты. Так что это решение

Я создал переменную списка, которая заполняется внутри getAlltutors ()Функция:

private lateinit var list: List<Tutor>

tutorViewModel.getAllTutors().observe(viewLifecycleOwner, Observer {
        list = it!!
        //rest of the code
    })

Тогда в OnListClickItem функция:

 override fun onListItemClick(view: View, position: Int) {

    val tutor = list[position]    //line that changed
    val fragment = UserDetails()
    val title = "User Details"
    val bundle = Bundle()
    println("Name: " + tutor.name)
    bundle.putString("name", tutor.name)
    bundle.putString("lastname", tutor.lastname)
    bundle.putString("email", tutor.email)
    bundle.putInt("userID", tutor.userId)
    bundle.putInt("role", tutor.roleFk)
    bundle.putString("course", tutor.pathName)
    fragment.arguments = bundle

    val fragmentManager = fragmentManager!!
    val ft = fragmentManager.beginTransaction()
    ft.replace(R.id.frame, fragment)
    ft.addToBackStack(null)
    ft.commit()

    (activity as AppCompatActivity).supportActionBar!!.title = title

}

Теперь это работает

0 голосов
/ 23 января 2019

проблема, вероятно, заключается в том, как вы идентифицируете данные элемента, который был нажат в вашем списке. что я обычно делаю, чтобы передать clicklistener как лямбда-функцию в RecyclerAdapter таким образом, вы можете установить список щелчков на держателе в onBindViewHolder так что этот подход может быть таким:

//in your ListAdapter class constructor instead of
class TutorListAdapter(private val tutorsList: MutableList<Tutor>?, private val onItemClickListener: ListItemClickListener)
//do like this
class TutorListAdapter(private val tutorsList: MutableList<Tutor>?, private val onItemClicked: (Tutor)->Unit)
//in your onBindViewHolder
override fun onBindViewHolder(listViewHolder: ListViewHolder, position: Int) {
   listViewHolder.view.setOnClickListener{
      onItemClicked(tutorsList[position])
      //rest of your code
   }
}
//in your fragment when creating TutorListAdapter
tutorViewModel.getAllTutors().observe(viewLifecycleOwner, Observer {
        if (it != null) {
            tutorListAdapter = TutorListAdapter(it as MutableList<Tutor>?, {tutor->
                    //you have the tutor object
                    //now do what ever you want
                })
            recyclerView!!.adapter = tutorListAdapter
        }
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...