Как мне вызвать метод Activity из адаптера представления Recycler? Или лучше: как получить доступ к элементам пользовательского интерфейса действия из адаптера?

У меня есть представление Recycler в ItemActivity и его адаптер как отдельный класс ItemAdapter. Теперь, исходя из количества выбранных элементов, мне нужно обновить текст на кнопке, размещенной в ItemActivity. Как это можно сделать?

примечание: я передал getApplicationContext () в качестве контекста адаптеру. Он передает контекст GlobalValue, который я установил в манифесте.

<application
    android:name = ".GlobalValues"
    android:allowBackup = "true"
    android:icon = "@mipmap/ic_launcher"
    android:label = "@string/app_name"
    android:roundIcon = "@mipmap/ic_launcher_round"
    android:theme = "@style/AppTheme">

Ниже приведен мой ItemActivity.xaml

    <?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout
    xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:layout_margin = "5dp"
    tools:context = ".ItemPickerActivity">

    <TextView
        android:id = "@+id/itemstext"
        android:layout_marginTop = "5dp"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text = "Choose Items"
        android:fontFamily = "@font/exo_semibold"
        android:textColor = "@color/dark_grey"              
        />    
    <android.support.v7.widget.RecyclerView
        android:layout_marginHorizontal = "3dp"
        android:id = "@+id/pickerRecview"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:layout_below = "@id/itemstext"
        android:layout_marginTop = "7dp" />

    <RelativeLayout
        android:layout_alignParentBottom = "true"
        android:layout_width = "match_parent"
        android:layout_height = "50dp"
        android:padding = "10dp"
        android:id = "@+id/checkout"
        android:clickable = "true"
        android:background = "@color/go_green"
        >

        <TextView
            android:id = "@+id/Total"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:text = "Rs XXX"
            android:layout_marginLeft = "5dp"
            android:textSize = "18sp"
            android:textColor = "@color/white"
            android:layout_centerVertical = "true"
            android:fontFamily = "@font/exo_semibold"
            />
        <TextView
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:text = "Checkout"
            android:textColor = "@color/white"
            android:layout_centerVertical = "true"
            android:layout_centerHorizontal = "true"
            android:textSize = "22sp"
            android:fontFamily = "@font/exo_semibold"
            />

        <TextView
            android:id = "@+id/TotalItems"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:layout_alignParentRight = "true"
            android:layout_centerVertical = "true"
            android:layout_marginRight = "5dp"
            android:text = "xx Items"
            android:fontFamily = "@font/exo_semibold"
            android:textColor = "@color/white"
            android:textSize = "18sp" />   
    </RelativeLayout>        
</RelativeLayout>

И вот как я создаю экземпляр объекта адаптера

ItemPickerAdapter adapter = new ItemPickerAdapter(getApplicationContext(), ItemsList);

            recyclerView.setAdapter(adapter);

Мне нужно изменить значение ItemCount в моем ItemActitvity с помощью адаптера! Пожалуйста, сообщите мне, как это возможно. Спасибо!

использовать интерфейс с обратным вызовом.

Abhay Koradiya 03.11.2018 11:26

вы можете передать слушателя из вашей активности в адаптер, проверьте этот пример >> stackoverflow.com/a/49397985/8009433

Navneet Krishna 03.11.2018 11:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
973
4

Ответы 4

Самый простой способ - сделать класс адаптера внутренним классом, содержащимся в классе Activity. Затем сделайте View, в котором вам нужно манипулировать глобальной переменной.

Спасибо! Это возможно, но я также хочу использовать этот адаптер для другого представления Recycler View в другом действии.

Karthi .M 03.11.2018 11:28

Тогда интерфейс - это способ.

Gavin Wright 03.11.2018 11:29

Измените экземпляр адаптера в своей деятельности с:

ItemPickerAdapter adapter = new ItemPickerAdapter(getApplicationContext(), ItemsList);

к этому:

ItemPickerAdapter adapter = new ItemPickerAdapter(this, ItemsList);

Это означает, что вы передаете контекст действия, а не контекст приложения.
Затем в своем классе адаптера объявите это:

MainActivity mainActivity = (MainActivity) context;

замените MainActivity на имя класса вашей деятельности и context на имя параметра вашего конструктора класса адаптера для контекста.

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

mainActivity.something

Редактировать1: используйте переменную в своем классе активности

Context mainContext = this;

затем создайте экземпляр адаптера:

ItemPickerAdapter adapter = new ItemPickerAdapter(mainContext, ItemsList);

Edit2: если вы хотите получить доступ к элементам пользовательского интерфейса вашей активности, таким как TextView, из вашего адаптера, создайте общедоступный метод внутри класса активности:

public void setTextViewText(String text) {
    myTextView.setText(text);
}

и вызываем его с адаптера:

mainActivity.setTextViewText("some text");

Я пробовал это, но это не работает ... --ItemPickerAdapter adapter = new ItemPickerAdapter (this, ItemsList); - здесь 'this' считается значением FirebaseEventListener ... я не знаю, почему

Karthi .M 03.11.2018 11:43

Где этот код? Разве это не внутри вашего класса активности?

forpas 03.11.2018 11:58

Внутри метода моей деятельности

Karthi .M 03.11.2018 12:01

проблема не в доступе к методу! Речь идет о доступе к элементам пользовательского интерфейса из другого класса

Karthi .M 03.11.2018 12:58

Вы имеете в виду TextViews и т. д.?

forpas 03.11.2018 13:01

Вы можете сделать следующее

Создайте единый интерфейс

public interface ItemCountListner {
  void onItemCountUpdate(int count);
}

Реализуйте интерфейс в своей деятельности и передайте ссылку своему адаптеру.

class MainActivity implements ItemCountListner {

---------
ItemPickerAdapter adapter = new ItemPickerAdapter(MainActivity.this, ItemsList, this);
---------

//implemented method
void onItemCountUpdate(int count){
 // update your ui
}
}

Добавьте аргумент в свой конструктор адаптера

public ItemPickerAdapter(Context context, List itemList, ItemCountListner listener)

Обновите свой интерфейс, позвонив

listener.onItemCountUpdate(count);

Внутри вашего адаптера RecyclerView вы можете определить свой собственный viewModel, а внутри него вы можете прикрепить onClick к любому компоненту, который хотите. Например:

 public class MyViewHolder extends RecyclerView.ViewHolder
    {
        private TextView eachFeaturesName;


        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            eachFeaturesName = itemView.findViewById(R.id.eachFeaturesName);
            }
    }

А внутри функции onBindViewHolder вы можете сделать это:

public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, final int position) {

//myViewHolder.eachFeaturesName.setonViewClickListener(...)

}

Это простой способ использовать onClickListener в RecyclerView.

Другие вопросы по теме