У меня есть представление 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">
<?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 с помощью адаптера! Пожалуйста, сообщите мне, как это возможно. Спасибо!
вы можете передать слушателя из вашей активности в адаптер, проверьте этот пример >> stackoverflow.com/a/49397985/8009433




Самый простой способ - сделать класс адаптера внутренним классом, содержащимся в классе Activity. Затем сделайте View, в котором вам нужно манипулировать глобальной переменной.
Спасибо! Это возможно, но я также хочу использовать этот адаптер для другого представления Recycler View в другом действии.
Тогда интерфейс - это способ.
Измените экземпляр адаптера в своей деятельности с:
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 ... я не знаю, почему
Где этот код? Разве это не внутри вашего класса активности?
Внутри метода моей деятельности
проблема не в доступе к методу! Речь идет о доступе к элементам пользовательского интерфейса из другого класса
Вы имеете в виду TextViews и т. д.?
Вы можете сделать следующее
Создайте единый интерфейс
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.
использовать интерфейс с обратным вызовом.