Как передать объект из фрагмента в подробный вид деятельности с помощью ViewModel (MVVM)? - PullRequest
0 голосов
/ 01 марта 2019

Я использую MVVM в качестве архитектуры, как я могу передать объект из фрагмента (recycler + viewModel) в действие (подробное представление + viewModel)?

Это модель представления для фрагмента

class BuyViewModel : ViewModel() {
private lateinit var buys: MutableLiveData<List<Buy>>
private var buyRemote = BuyRemote()
private var buyRepository: BuyRepository = BuyRepository.getInstance(buyRemote)

fun getBuys(): LiveData<List<Buy>> {
    if(!::buys.isInitialized) {
        buys = MutableLiveData()
        buys = buyRepository.getBuys()
    }
    return buys
}

}

Это Адаптер для фрагмента

class BuyAdapter(internal var context: Context,
             private var resource: Int,
             private var buyList: ArrayList<Buy>
) : RecyclerView.Adapter<BuyAdapter.ViewHolder>() {

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

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view = LayoutInflater.from(context)
        .inflate(resource, parent, false)
    return ViewHolder(view)
}


override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val buy: Buy = buyList[position]
    val propertyImages: List<String> =
        buy.propertyImage.split(",")


    //Start DetailView Activity
    holder.itemView.setOnClickListener {
        Toast.makeText(context, "clicked", Toast.LENGTH_SHORT).show()
        val intent = Intent(context, BuyDetailActivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        context.startActivity(intent)
    }
}

+++++++++++++++code removed for brevity+++++++++++++++++

И, наконец, это фрагмент

class BuyFragment : Fragment() {
companion object {
    fun newInstance() = BuyFragment()
}

private lateinit var viewModel: BuyViewModel
private val buyList = ArrayList<Buy>()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel = ViewModelProviders.of(this).get(BuyViewModel::class.java)

    viewModel.getBuys().observe(this, Observer<List<Buy>> { buys ->
        buyList.addAll(buys)
        (rvBuy.adapter as BuyAdapter).notifyDataSetChanged()
    })
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.buy_fragment, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    rvBuy.layoutManager = LinearLayoutManager(context)
    rvBuy.adapter = BuyAdapter(activity!!.applicationContext,
        R.layout.buy_card, buyList)
}

Как я могуреализовать это при соблюдении передового опыта.Когда пользователь щелкает элемент из представления (фрагмента) переработчика, он передает объект «Купить» в действие.Должен ли этот вид деятельности использовать модель представления самостоятельно?Как?Должно ли действие использовать ту же модель представления, что и представление рециклера фрагментов?

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете использовать модель общего представления, которая привязана к активности между фрагментами.Получите ViewModel во фрагментах следующим образом.

val sharedViewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class.java)

Затем во фрагменте списка onClick class sharedViewModel.onItemClicked(item)

SharedViewModel {
    private val _selectedItem = MutableLiveData<T>()
    val selectedItem: LiveData<T> get() = _selectedItem

    fun onItemClick(item: T) {
        _selectedItem.value = item
    }
}

Затем во фрагменте Detail

sharedViewModel.selectedItem.observe {
    detailViewModel.setItem(it)
}

Затем в модели подробного представления загрузите элемент и отобразите.

ОБНОВЛЕНИЕ

Чтобы получить доступ к модели общего представления из действия, получите модель представления:

val sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)

Затем обратите внимание на selectedItem LiveData, как во фрагменте.

...