Установите OnClickListeners для кнопок в счетчике внутри recyclerView

Я хочу установить onClickListeners для кнопок в счетчике, который находится внутри recyclerView. Вот что я построил (используя счетчик в моем случае): -

(https://i.stack.imgur.com/DmyJl.jpg)

У каждого элемента в моем recyclerView есть собственный счетчик, который содержит две опции для каждого элемента: Обновить сведения и Удалить. Как и в каком классе я могу установить onClickListeners для этих кнопок, чтобы я мог получить, какая кнопка (обновить или удалить) была нажата на какой элемент recyclerView, чтобы я мог обновить/удалить этот конкретный пароль в моей базе данных. Мой код: -

PasswordsActivity.java: -

public class PasswordsActivity extends AppCompatActivity {

RecyclerView recyclerView;
FloatingActionButton FAB;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_passwords);

    recyclerView = (RecyclerView) findViewById(R.id.password_list);
    FAB = (FloatingActionButton) findViewById(R.id.buttonAdd);

    getSupportActionBar().setTitle("Saved Passwords");

    DBHelper helper = new DBHelper(this);

    ArrayList<PasswordModel> passwordModelArrayList = new ArrayList<>();
    passwordModelArrayList.clear();

    passwordModelArrayList = helper.readPasswords();

    PasswordAdapter passwordAdapter = new PasswordAdapter(this, passwordModelArrayList );

    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);

    recyclerView.setItemAnimator(new DefaultItemAnimator());

    recyclerView.setLayoutManager(layoutManager);

    recyclerView.setAdapter(passwordAdapter);

    FAB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(PasswordsActivity.this, AddPasswords.class);
            startActivity(intent);
        }
    });

}

@Override
protected void onResume() {
    super.onResume();
    DBHelper helper = new DBHelper(this);

    ArrayList<PasswordModel> passwordModelArrayList = new ArrayList<>();
    passwordModelArrayList.clear();

    passwordModelArrayList = helper.readPasswords();

    PasswordAdapter passwordAdapter = new PasswordAdapter(this, passwordModelArrayList );

    recyclerView.setAdapter(passwordAdapter);

}

PasswordAdapter.java: -

public class PasswordAdapter extends 
RecyclerView.Adapter<PasswordAdapter.MyViewHolder>{

Context context;
ArrayList<PasswordModel> arrayList;


@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.passwords_list, parent, false);

    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    TextView username;
    TextView password;
    TextView website;

    username = holder.usernameView;
    password = holder.passwordView;
    website = holder.websiteView;

    username.setText(arrayList.get(position).getSavedUsername());
    password.setText(arrayList.get(position).getSavedPassword());
    website.setText(arrayList.get(position).getSavedWebsite());


}

@Override
public int getItemCount() {
    return arrayList.size();
}

@Override
public long getItemId(int position) {
    return position;
}

class MyViewHolder extends RecyclerView.ViewHolder
{
    TextView usernameView;
    TextView websiteView;
    TextView passwordView;

    public MyViewHolder(final View itemView)
    {
        super(itemView);

        this.passwordView = (TextView)itemView.findViewById(R.id.textPassword);
        this.usernameView = (TextView)itemView.findViewById(R.id.textUsername);
        this.websiteView = (TextView)itemView.findViewById(R.id.textWebsite);

       Spinner spinner = (Spinner)itemView.findViewById(R.id.spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context.getApplicationContext(), R.array.options_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
    }

}

public PasswordAdapter(Context context, ArrayList<PasswordModel> arrayList)
{
    this.context = context;
    this.arrayList = arrayList;
}

}

Пожалуйста, дайте мне знать, если что-то еще нужно.

Подходит ли это решение для вашего варианта использования stackoverflow.com/a/28532057/3649629?

Gleichmut 15.02.2023 03:49

@Gleichmut не совсем. Однако можете ли вы предложить реализацию кнопок в PasswordsActivity, как это предлагается в ответе ниже?

AsCress 15.02.2023 06:41
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел &quot;Заголовок&quot; в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
1
2
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добро пожаловать в СО! Да, ты можешь это сделать. Можете ли вы попробовать изменить свой класс adapter следующим образом:

!!!ОБНОВЛЯТЬ!!!

package com.xxx.sample;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class PasswordAdapter extends
        RecyclerView.Adapter<PasswordAdapter.MyViewHolder>{

    Context context;
    ArrayList<PasswordModel> arrayList;
    
    ItemClickCallBack callback;


    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.passwords_list, parent, false);

        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        PaaswordModel pwdModel = arrayList.get(position);
        holder.position = position;
        holder.bind(pwdModel);
    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    class MyViewHolder extends RecyclerView.ViewHolder
    {
        TextView usernameView;
        TextView websiteView;
        TextView passwordView;
        int position;

        public MyViewHolder(final View itemView)
        {
            super(itemView);

            this.passwordView = (TextView)itemView.findViewById(R.id.textPassword);
            this.usernameView = (TextView)itemView.findViewById(R.id.textUsername);
            this.websiteView = (TextView)itemView.findViewById(R.id.textWebsite);

            Spinner spinner = (Spinner)itemView.findViewById(R.id.spinner);
            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context.getApplicationContext(), R.array.options_array, android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner.setAdapter(adapter);
        }

        public void bind(PaaswordModel pwdModel) {
            usernameView.setText(pwdModel.getSavedUsername());
            passwordView.setText(pwdModel.getSavedPassword());
            websiteView.setText(pwdModel.getSavedWebsite());
            itemView.setOnClickListener(view -> {
                callback.onItemClickCallBack(pwdModel);
            });
    spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int i, long id) {
    String value = getResources().getStringArray(R.id.<value_array>)[i];
        callback.onSpinnerClickCallBack(value, position);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here or leave empty
    }

});
        }
    }

    public PasswordAdapter(Context context, ArrayList<PasswordModel> arrayList, ItemClickCallBack callback)
    {
        this.context = context;
        this.arrayList = arrayList;
        this.callback = callback;
    }
    
    public interface ItemClickCallBack {
        void onItemClickCallBack(PasswordModel item);
        void onSpinnerClickCallBack(String item, int pos);
    }

}

После этого вы можете найти ошибку в своем классе активности в следующей строке:

PasswordAdapter passwordAdapter = new PasswordAdapter(this, passwordModelArrayList, <argument missing>);

ПарольАктивность:

public class PasswordsActivity extends AppCompatActivity {

RecyclerView recyclerView;
FloatingActionButton FAB;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_passwords);

.....

    PasswordAdapter passwordAdapter = new PasswordAdapter(this, passwordModelArrayList, new PasswordAdapter.ItemClickCallBack{
@Override
public void onItemClickCallBack(PasswordModel model) {
// do your code using this model
}
@Override
public void onSpinnerClickCallBack(String spinnerItem, int pos) {
// do your code using this model
// spinnerItem gives the text of spinner item selected and pos gives the position of the item in recyclerView
}
});

Или вы можете передать this, чтобы вы могли реализовать метод callback внутри вашего класса представления или класса активности, а затем вы сможете получить информацию из 2 (двух) методов overrides, которые являются onItemClickCallBack (от щелчка элемента) и onSpinnerClickCallBack (для щелчка по элементу счетчика). Теперь вы должны быть в состоянии делать свою следующую работу отсюда и далее. Надеюсь, это поможет вам. Удачного кодирования.

Большое спасибо! Я не совсем уверен, что смогу реализовать эти кнопки в своем классе активности. Можете ли вы сказать, как после этого я могу установить слушателей в своем классе активности. Извините, новичок в андроиде.

AsCress 15.02.2023 04:21

Решает ли это цель нажатия на конкретный элемент в счетчике? Я имею в виду, как бы мы реализовали это в PasswordsActivity?

AsCress 15.02.2023 06:19

Передайте это в последний параметр, где вы инициализировали адаптер. Вы просто внедряете onClickListener в itemView, это то, что я показал в ответе. Если вы хотите выбрать элемент из списка счетчиков, вам может потребоваться немного обновить. Я скоро обновлю свой ответ. Пожалуйста, посмотрите, когда вы увидите обновление в верхней части ответа. Спасибо

A S M Sayem 15.02.2023 06:44

Спасибо. Да, я хочу, чтобы, если я выберу вариант обновления для определенного пароля в списке, новое действие должно открыться... и т.д.... для удаления. Теперь я просто хотел получить идентификатор элемента в recyclerView, чтобы я мог обновить/удалить этот конкретный пароль. Каждый элемент в recyclerView имеет одинаковый набор параметров в счетчике..... (обновить детали/удалить)...

AsCress 15.02.2023 07:05

@AsCress, я обновил свой ответ, вы можете передать любое значение, которое хотите, для достижения своей цели с помощью обратных вызовов, когда вы реализуете его внутри своей деятельности. Пожалуйста, дайте мне знать, если это работает, я не мог проверить, но по логике это должно работать.

A S M Sayem 15.02.2023 08:21

@ASMSayem Еще раз спасибо за ваше время. Я просто хотел знать, как теперь я могу реализовать это решение в своей ParkingActivity, поскольку эта концепция для меня немного нова. Не могли бы вы поделиться кодом того, что вы хотите сделать именно в моей деятельности, используя обратный вызов, я имею в виду, например, код для выбора кнопки удаления третьей записи в recyclerView.

AsCress 15.02.2023 08:36

@AsCress, пожалуйста, проверьте эту ссылку: wiseassblog.com/tutorials/java/android/interface/2016/09/13/‌​… и дайте мне знать, что у вас все еще есть сомнения по поводу реализации. Также проверьте обновленную версию ответа еще раз. Спасибо

A S M Sayem 15.02.2023 08:57

Это нормально. Но в onSpinnerClickCallback, как я узнаю, что выбран счетчик какого элемента в recyclerView?

AsCress 15.02.2023 09:12

Большое спасибо за вашу помощь. Я решил проблему, добавив немного в ваш код. Могу ли я обновить ваш ответ, а затем принять его?

AsCress 16.02.2023 03:09

Конечно пойти на это. Рад был помочь! Кстати, вот как вы получаете выбранный элемент (вы также можете передать позицию, если вам нужно, через интерфейс/обратный вызов): `spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override , View selectedItemView, int position, long id) { String value = getResources().getStringArray(R.id.<value_array>)[position]; callback.onSpinnerClickCallBack(); } } `Пожалуйста, проголосуйте за, принимая мой ответ .

A S M Sayem 16.02.2023 03:50

Я отредактировал и принял ваш ответ. Редактирование будет видно, как только будет одобрено, я думаю. Спасибо за помощь снова!

AsCress 18.02.2023 04:39

Я одобрил ваше редактирование, пожалуйста, не проголосуйте за него. Мне нужно достичь 2к повторений. Спасибо, счастливых дней

A S M Sayem 21.02.2023 07:33

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