У меня есть уже несколько вопросов связанных с этой задачей, вот например этот Как заполнить массив числами long которые получаются при выборе checkBox?. Там мне предоставили вопрос с ответом который решил мою проблему, но все-равно есть некоторые сложности в решении моей проблемы. Суть проста, выделить несколько элементов списка, в моем случае это сообщения, и удалить их, или переслать. Все вроде просто, но как всегда возникли сложности. В адаптере списка получаю массив состоящий из id выделенных сообщений, но теперь непонятно как получать этот массив в другом классе. Изначально вообще непонятно как сделать само удаление. Вопрос не по отправке на сервер запроса, а вообще про логику поведения программы - вот выделили мы например 2 сообщения, дальше я думаю сделать видимой кнопку которая будет удалять эти сообщения, но проблема в том что я получаю массив с идентификаторами в адаптере списка, а удалять придется в главном классе, а для этого нужно каким-то образом вытащить из адаптера массив. Вот есть в адаптере функция:
public int[] getChecked() {
return checked;
}
которая возвращает массив моих чисел, но я столкнулся с проблемой, когда главный класс не видит этот метод. Вот весь адаптер целиком:
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.SenderHolder> {
private Integer type;
private ArrayList<Message> messageList;
private Context ctx;
public int[] checked;
private static final String keyOutboundMessageId = "outbound_message_id";
private static final String keyIncomingMessageId = "incoming_message_id";
private static final String keyDraftMessageId = "draft_message_id";
ListAdapter(ArrayList<Message> messageList, Context ctx, int type) {
this.messageList = messageList;
this.ctx = ctx;
this.type = type;
checked = new int[messageList.size()];
}
@NonNull
@Override
public SenderHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_of_rec_m, viewGroup, false);
return new SenderHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull final SenderHolder holder, final int position) {
final Message message = messageList.get(position);
holder.checkBox.setVisibility(View.GONE);
holder.deleteBtn.setVisibility(View.GONE);
boolean attachment = message.isAttachment();
Integer new_one = message.getNewField();
if (attachment) {
holder.attachIV.setVisibility(View.VISIBLE);
} else {
holder.attachIV.setVisibility(View.GONE);
}
switch (type) {
case 0:
holder.tvFrom.setText(message.getSender_name());
break;
case 1:
holder.tvFrom.setText(message.getReceiver_name());
break;
case 2:
holder.tvFrom.setText(message.getReceiver_name());
break;
}
if (new_one == 1 && !TextUtils.isEmpty(message.getSender_name())) {
holder.tvSubject.setTypeface(null, Typeface.BOLD);
holder.tvDate.setTypeface(null, Typeface.BOLD);
holder.tvFrom.setTypeface(null, Typeface.BOLD);
}
holder.tvSubject.setText(message.getSubject());
DateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
String isoString = message.getDate();
try {
Date date = isoFormat.parse(isoString);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault());
String dateString = dateFormat.format(date);
holder.tvDate.setText(dateString);
} catch (ParseException ignored) {
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(ctx, MessageShow.class);
switch (type) {
case 0:
intent.putExtra(ListAdapter.class.getSimpleName() + keyOutboundMessageId, message.getId());
break;
case 1:
intent.putExtra(ListAdapter.class.getSimpleName() + keyIncomingMessageId, message.getId());
break;
case 2:
intent.putExtra(ListAdapter.class.getSimpleName() + keyDraftMessageId, message.getId());
break;
}
ctx.startActivity(intent);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
if (message.isCan_delete()) {
holder.checkBox.setVisibility(View.VISIBLE);
//holder.deleteBtn.setVisibility(View.VISIBLE);
holder.attachIV.setVisibility(View.GONE);
holder.tvDate.setVisibility(View.GONE);
}
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if (isChecked) {
checked[holder.getAdapterPosition()] = message.getId();
Toast.makeText(ctx, Arrays.toString(checked), Toast.LENGTH_SHORT).show();
}
}
});
return true;
}
});
}
public int[] getChecked() {
return checked;
}
@Override
public int getItemCount() {
return messageList.size();
}
class SenderHolder extends RecyclerView.ViewHolder {
final TextView tvFrom, tvSubject, tvDate;
final ImageView attachIV;
final CheckBox checkBox;
final Button deleteBtn;
SenderHolder(View itemView) {
super(itemView);
tvFrom = itemView.findViewById(R.id.tv_from);
tvSubject = itemView.findViewById(R.id.tv_subject);
tvDate = itemView.findViewById(R.id.tv_date);
attachIV = itemView.findViewById(R.id.clip);
checkBox = itemView.findViewById(R.id.check_item);
deleteBtn = itemView.findViewById(R.id.delete);
}
}
}
и теперь мне нужно как-то вытащить отсюда массив, студия предлагает сделать этот метод статичным, чтобы все работало, но тогда метод вообще не может ничего вернуть нормально. В чем может быть проблема при вызове этого метода?
я кажется смог наконец-то сформулировать проблему для себя и соответственно мне проще у всех спросить то что нужно. У меня есть метод в адаптере который возвращает массив выделенных для удаления элементов списка, и мне нужно получить в главном классе этот массив. Для того чтобы нормально вызывался метод, мне студия предложила сделать этот метод в статическим. Логика в том что я хочу при нажатии на кнопку удалять выделенные элементы списка, в моем случае это сообщения. То есть соответственно мне нужно при нажатии на кнопку получить этот массив и послать запрос на сервер. Честно говоря у меня почему-то не получается добавить пока кнопку на экран со списком, но суть я думаю стала ясна. Если все-таки нужен какой-то код то я докину слушатель нажатий на кнопку.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости