Можем ли мы заменить findViewById (), используя привязку данных Android в этом конкретном сценарии? - PullRequest
1 голос
/ 08 апреля 2019

После привязки данных Google для Android я удалил findViewById() в своем коде.

У меня есть вид переработчика с прослушивателем щелчков для каждой кнопки в определенном представлении элемента. Я пытаюсь найти способ устранить метод findViewById() в данном конкретном случае.

Фрагмент кода из файла MainFragment.java:

// Add touch listener for the recycler view
    mainFragmentBinding.mainFragmentFoodItemsRecyclerView.addOnItemTouchListener(
            new RecyclerTouchListener(
                    getContext(),
                    mainFragmentBinding.mainFragmentFoodItemsRecyclerView,
                    new ClickListener() {

                        @Override
                        public void onClick(View view, final int position) {


                            Button addButton = view.findViewById(R.id.food_add_button);

                            addButton.setOnClickListener(addButtonView -> {

                                // Notify user
                                Toast.makeText(getContext(), "Clicked on Add button",
                                        Toast.LENGTH_SHORT).show();
                            });

                            // Values are passing to activity & to fragment as well
                            Toast.makeText(
                                    getContext(),
                                    "Single Click on position : " + position,
                                    Toast.LENGTH_SHORT
                            ).show();
                        }

                        @Override
                        public void onLongClick(View view, int position) {

                            Toast.makeText(
                                    getContext(),
                                    "Long press on position : " + position,
                                    Toast.LENGTH_LONG
                            ).show();
                        }
                    }
            ));

Строка, которую я хочу изменить из приведенного выше фрагмента:

Button addButton = view.findViewById(R.id.food_add_button);

Возможно ли это? Если да, может ли кто-нибудь помочь мне с тем же?
Или я должен оставить метод findViewById() как таковой?

1 Ответ

2 голосов
/ 08 апреля 2019

Да, вы можете заменить его, и вы, вероятно, должны.

Для этого сначала подготовьте макет элемента для привязки данных и добавьте туда обратный вызов click:

?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="item"
            type="com.example.your.item.Type"/>
        <variable
            name="parentViewModel"
            type="com.example.your.viewmodel.Type"/>
    </data>

    <YourLayout
        ...
        android:onClick="@{() -> parentViewModel.onItemClicked(item)}"
        ...
        YourLayout />

</layout>

В вашем владельце представления объявите свойство для хранения привязки ссылки на макет вашего элемента:

lateinit var binding: YoutItemLayoutBindable

В вашем адаптере, внутри onCreateViewHolder(...), убедитесь, что вы раздули свой макет элемента, используя привязку данных:

val inflater = LayoutInflater.from(parent.context)
val binding = DataBindingUtil.inflate<YoutItemLayoutBindable>(inflater, R.layout.your_item_layout, parent, false)
val viewHolder = ViewHolder(binding.root)

// Pass your activity/fragment as the lifeCycleOwner when creating the adapter
binding.lifecycleOwner = lifeCycleOwner

// Pass also your viewmodel as a parameter when creating the adapter
binding.parentViewModel = parentViewModel

viewHolder.binding = binding

return viewHolder

Затем внутри onBindViewHolder(...) установите элемент в качестве переменной для вашей привязки:

val item = dataSet[position]
viewHolder.binding.item = item

И это все! Ваш код может отличаться от этого примера (возможно, вы даже не используете viewmodels), но я надеюсь, что вы поняли идею.

...