Правильный способ доступа к ViewModel из Recyler Adaper - PullRequest
0 голосов
/ 21 февраля 2020

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

У меня есть кнопка, которую я нажимаю для каждой строки (Элемент в списке RecyclerView), это сохраняет данные с использованием ViewModel.

У меня есть обнаружил, что я могу напрямую вызвать ViewModel, инициализировал его в конструкторе, я проверил примеры Google Android, и эта часть не рассматривается.

Пример примерно так: Скопировано из: Привязка данных Recyclerview и onClick

private ExampleViewModel exampleViewModel;

public ExampleListAdapter(Context context, List<Model> models) {
        this.context = context;
        this.models = models;

        // ...
        exampleViewModel = ViewModelProviders.of((FragmentActivity) context).get(ExampleViewModel.class);
}

Но тогда я мог бы также вызвать ViewModel, передав объект ViewModel из Activity вместе с контекстом.

Так что же самое способ вызова ViewModel?

1 Ответ

0 голосов
/ 21 февраля 2020

Это ваш класс pojo

data class Item(val id: Int)

Это ваш адаптер.

class Adapter : RecyclerView.Adapter<Adapter.ViewHolder>() {

    var items: List<Item> = emptyList()
        set(value) {
            field = value
            notifyDataSetChanged()
        }

    var callback: Callback? = null

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

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val itemView = LayoutInflater.from(parent.context)
            .inflate(R.layout.simple_textview, parent, false)
        return ViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = items[position]
        holder.itemView.setOnClickListener {
            callback?.onItemClicked(item)
        }
        holder.bindItem(item)
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        fun bindItem(item: Item) {
            // Fill layout
        }
    }

    interface Callback {
        fun onItemClicked(item: Item)
    }
}

Это ваш класс viewModel.

class MyViewModel : ViewModel(), Adapter.Callback {

    override fun onItemClicked(item: Item) {

    }
}

А это ваш фрагмент.

class MyFragment : Fragment() {

    private val adapter = Adapter()

    private lateinit var myViewModel: MyViewModel


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        myViewModel = ViewModelProviders.of(activity!!).get(MyViewModel::class.java)
        adapter.callback = myViewModel
    }

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

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        adapter.items = listOf(
            Item(1),
            Item(2)
        )

        //Setup recyclerView etc.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...