Я хочу установить 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;
}
}
Пожалуйста, дайте мне знать, если что-то еще нужно.
@Gleichmut не совсем. Однако можете ли вы предложить реализацию кнопок в PasswordsActivity, как это предлагается в ответе ниже?
Добро пожаловать в СО! Да, ты можешь это сделать. Можете ли вы попробовать изменить свой класс 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 (для щелчка по элементу счетчика). Теперь вы должны быть в состоянии делать свою следующую работу отсюда и далее. Надеюсь, это поможет вам. Удачного кодирования.
Большое спасибо! Я не совсем уверен, что смогу реализовать эти кнопки в своем классе активности. Можете ли вы сказать, как после этого я могу установить слушателей в своем классе активности. Извините, новичок в андроиде.
Решает ли это цель нажатия на конкретный элемент в счетчике? Я имею в виду, как бы мы реализовали это в PasswordsActivity?
Передайте это в последний параметр, где вы инициализировали адаптер. Вы просто внедряете onClickListener в itemView, это то, что я показал в ответе. Если вы хотите выбрать элемент из списка счетчиков, вам может потребоваться немного обновить. Я скоро обновлю свой ответ. Пожалуйста, посмотрите, когда вы увидите обновление в верхней части ответа. Спасибо
Спасибо. Да, я хочу, чтобы, если я выберу вариант обновления для определенного пароля в списке, новое действие должно открыться... и т.д.... для удаления. Теперь я просто хотел получить идентификатор элемента в recyclerView, чтобы я мог обновить/удалить этот конкретный пароль. Каждый элемент в recyclerView имеет одинаковый набор параметров в счетчике..... (обновить детали/удалить)...
@AsCress, я обновил свой ответ, вы можете передать любое значение, которое хотите, для достижения своей цели с помощью обратных вызовов, когда вы реализуете его внутри своей деятельности. Пожалуйста, дайте мне знать, если это работает, я не мог проверить, но по логике это должно работать.
@ASMSayem Еще раз спасибо за ваше время. Я просто хотел знать, как теперь я могу реализовать это решение в своей ParkingActivity, поскольку эта концепция для меня немного нова. Не могли бы вы поделиться кодом того, что вы хотите сделать именно в моей деятельности, используя обратный вызов, я имею в виду, например, код для выбора кнопки удаления третьей записи в recyclerView.
@AsCress, пожалуйста, проверьте эту ссылку: wiseassblog.com/tutorials/java/android/interface/2016/09/13/… и дайте мне знать, что у вас все еще есть сомнения по поводу реализации. Также проверьте обновленную версию ответа еще раз. Спасибо
Это нормально. Но в onSpinnerClickCallback, как я узнаю, что выбран счетчик какого элемента в recyclerView?
Большое спасибо за вашу помощь. Я решил проблему, добавив немного в ваш код. Могу ли я обновить ваш ответ, а затем принять его?
Конечно пойти на это. Рад был помочь! Кстати, вот как вы получаете выбранный элемент (вы также можете передать позицию, если вам нужно, через интерфейс/обратный вызов): `spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override , View selectedItemView, int position, long id) { String value = getResources().getStringArray(R.id.<value_array>)[position]; callback.onSpinnerClickCallBack(); } } `Пожалуйста, проголосуйте за, принимая мой ответ .
Я отредактировал и принял ваш ответ. Редактирование будет видно, как только будет одобрено, я думаю. Спасибо за помощь снова!
Я одобрил ваше редактирование, пожалуйста, не проголосуйте за него. Мне нужно достичь 2к повторений. Спасибо, счастливых дней
Подходит ли это решение для вашего варианта использования stackoverflow.com/a/28532057/3649629?