RecyclerView и его адаптер
Помогите пожалуйста корректно достать позицию элемента списка, который установлен в recyclerView через адаптер. Пытался это сделать разными костыльными способами, но у меня постоянно позиция обнуляется. Пытался брать ее у вьюХолдера и передавать туда, куда надо. От туда приходить ноль. Пытался при добавлении элемента нового считать размер листа и крайнее значение сэтать крайнему объекту в списке. Даже сделал counter, который после добавления объекта в список присваивал этому объекту номер, который соответствовал его позиции в списке. Костыли не сработали. К примеру - есть класс MainActivity и EditContactActivity. Интент для этого установлен в кастомном сликЛиснэре, который вызывается из мэйн активити. И вот, contactBody.getPosition() из мэйн уходит к примеру равное 3, а во втору активити приходит уже 0.
Фрагмент кода mainActivity
DataAdapter.OnContactClickListener onContactClickListener = (contactBody, position) -> {
intent = new Intent(MainActivity.this, EditContactActivity.class);
intent.putExtra("edit pool", (Serializable) contactBody);
Log.i("LOGG", String.valueOf(contactBody.getPosition()));
startActivityForResult(intent, 2);
};
adapter = new DataAdapter(this, contacts, onContactClickListener);
recyclerView.setAdapter(adapter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == 1) {
cb = (ContactBody) data.getSerializableExtra("add_contact");
cb.setPosition(counter);
++counter;
contacts.add(cb);
Log.i("KEY", String.valueOf(cb.getPosition()));
} else if (resultCode == RESULT_OK && requestCode == 2) {
if (data.hasExtra("delete pool")) {
cb = (ContactBody) data.getSerializableExtra("delete pool");
contacts.remove(cb.getPosition());
adapter.notifyDataSetChanged();
} else if (data.hasExtra("edit pool")) {
cb = (ContactBody) data.getSerializableExtra("edit pool");
contacts.set(cb.getPosition(), cb);
adapter.notifyDataSetChanged();
}
}
checkState();
}
Фрагмент кода DataAdapter
@Override
public void onBindViewHolder(@NonNull DataAdapter.ViewHolder holder, int position) {
ContactBody contactBody = contacts.get(position);
holder.imageView.setImageResource(contactBody.getImage());
holder.nameView.setText(contactBody.getContactName());
holder.numberView.setText(contactBody.getEmailOrNumber());
bind(contacts.get(position), onContactClickListener, holder, position);
}
private void bind(ContactBody contact,
OnContactClickListener onContactClickListener,
@NonNull DataAdapter.ViewHolder holder,
int position) {
holder.layoutParent.setOnClickListener(v -> {
onContactClickListener.onContactClick(contact, position);
});
}
@Override
public int getItemCount() {
return contacts.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
final ImageView imageView;
final TextView nameView, numberView;
final ConstraintLayout layoutParent;
ViewHolder(View view) {
super(view);
imageView = view.findViewById(R.id.image);
nameView = view.findViewById(R.id.name);
numberView = view.findViewById(R.id.numberOrEmail);
layoutParent = view.findViewById(R.id.itemBody);
}
}
Фрагмент кода ContactBody
private int image;
private String contactName;
private String emailOrNumber;
private int position;
public ContactBody(int image, String contactName, String emailOrNumber) {
this.image = image;
this.contactName = contactName;
this.emailOrNumber = emailOrNumber;
}
private ContactBody(Parcel in) {
image = in.readInt();
contactName = in.readString();
emailOrNumber = in.readString();
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}