【发布时间】:2023-01-05 23:44:22
【问题描述】:
我用房间和分页库与MVVM(模型-视图-视图模型)。
我想要得到的是一个 Retrofit CALL 来为每个人获取一些数据可见的Recycler View 中的项目,然后相应地更新视图。现在我所得到的只是实现分页库并相应地显示数据。
我能做的是获取 PagedList 并获取整个列表的数据并更新视图?我可以为列出的每个项目进行 API 调用吗?我们不希望用户等待很长时间才能看到可见项目的更新数据......
class AllPetsFragment : Fragment() {
private lateinit var binding : FragmentAllPetsfragmentBinding private lateinit var linearLayoutManager: LinearLayoutManager private lateinit var allPetsViewModel: MainActivityViewModel
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View
{
binding = FragmentAllPetsfragmentBinding.inflate(inflater, container, false)
val view : View = binding.root
allPetsViewModel = ViewModelProvider(requireActivity()).get(MainActivityViewModel::class.java)
binding.btnOpenAddPet.setOnClickListener{
startActivity(Intent(activity, AddPetActivity::class.java))
}
val adapter = PetAdapter(requireContext(), ClickListener {
allPetsViewModel.updateData(it)
val action = AllPetsFragmentDirections.actionMainMap()
Navigation.findNavController(view).navigate(action)
})
linearLayoutManager = LinearLayoutManager(requireContext())
binding.petsRecycler.layoutManager = linearLayoutManager
binding.petsRecycler.adapter = adapter
subscribeUi(adapter)
return view
}
private fun subscribeUi(adapter: PetAdapter) { allPetsViewModel.getDevicesLiveData().observe(viewLifecycleOwner, { names -> if (names != null){ adapter.submitList(names) }
})
} }
class PetAdapter(val context: Context, private val cl: ClickListener) : PagedListAdapter<Device, PetAdapter.PetViewHolder>(PersonDiffCallback()) {
override fun onBindViewHolder(holder: PetViewHolder, position: Int) { val device = getItem(position)
if (device == null) {
holder.clear()
} else {
holder.bind(device, cl.clickListener)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PetViewHolder { return PetViewHolder(LayoutInflater.from(context).inflate(R.layout.item_pet, parent, false)) }
class PetViewHolder(view: View) : RecyclerView.ViewHolder(view) {
var tvName: TextView = view.findViewById(R.id.petName)
var tvDistance: TextView = view.findViewById(R.id.totalDistance)
var txtBattery: TextView = view.findViewById(R.id.txtBattery)
var txtGeofence: TextView = view.findViewById(R.id.txtGeofence)
fun bind(device: Device, clickListener: (Device) -> Unit) {
tvName.text = device.name
itemView.setOnClickListener { clickListener(device) }
}
fun clear() {
tvName.text = null
}
}}
我应该在这里做什么?如何为不同的 RecyclerView item 调用不同的 API?
谢谢!
【问题讨论】:
标签: android api kotlin android-recyclerview retrofit