#android #android-intent #android-recyclerview
#Android #android-намерение #android-recyclerview
Вопрос:
Я не могу решить проблему: у меня есть RecyclerView (список контактов). Когда я нажимаю на ilem, оно должно отображать новое действие с информацией об этом элементе. У меня есть код, но я не понимаю, почему он не работает. Может быть, кто-нибудь мог бы мне помочь. Заранее спасибо. мой класс адаптера:
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder> {
private LayoutInflater layoutInflater;
private List<Contact> contacts;
private Context context;
public ContactAdapter(Context context, List<Contact> contacts) {
this.contacts = contacts;
this.layoutInflater = LayoutInflater.from(context);
}
@NonNull
@Override
public ContactAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = layoutInflater.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ContactAdapter.ViewHolder holder, final int position) {
final Contact contact = contacts.get(position);
holder.imageView.setImageResource(contact.getImage());
holder.nameView.setText(contact.getName());
holder.numberView.setText(contact.getNumber());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), SecondActivity.class);
intent.putExtra("image",contact.getImage());
intent.putExtra("name", contact.getName());
intent.putExtra("number", contact.getNumber());
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return contacts.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
final ImageView imageView;
final TextView nameView, numberView;
ViewHolder(View view) {
super(view);
imageView = view.findViewById(R.id.image);
nameView = view.findViewById(R.id.name);
numberView = view.findViewById(R.id.number);
}
}
}
мой класс активности:
public class ListActivity extends AppCompatActivity {
private List<Contact> contactList = new ArrayList<>();
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
setInitialData();
recyclerView = findViewById(R.id.list);
ContactAdapter contactAdapter = new ContactAdapter(this, contactList);
recyclerView.setAdapter(contactAdapter);
}
private void setInitialData() {
contactList.add(new Contact(R.drawable.face, "Anna Anna", "358742596814"));
contactList.add(new Contact(R.drawable.face, "Max Max", "358742596814"));
contactList.add(new Contact(R.drawable.face, "David David", "358742596814"));
contactList.add(new Contact(R.drawable.face, "James James", "358742596814"));
contactList.add(new Contact(R.drawable.face, "Lidia Lidia", "358742596814"));
contactList.add(new Contact(R.drawable.face, "Alice Alice", "358742596814"));
contactList.add(new Contact(R.drawable.face, "Mark Mark", "358742596814"));
}
}
и класс второго действия:
public class SecondActivity extends AppCompatActivity {
private ImageView imageView;
private TextView textName;
private TextView textNumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secondary_activity);
Intent intent = getIntent();
String name = getIntent().getStringExtra("name");
String number = getIntent().getStringExtra("number");
imageView = findViewById(R.id.imageView);
textName = findViewById(R.id.textName);
textNumber = findViewById(R.id.textNumber);
textNumber.setText(number);
textName.setText(name);
}
}
Комментарии:
1. Что ж… Что именно не работает? Или что происходит вместо этого?
2. Код на самом деле выглядит нормально для меня. Вы пытались отладить его или установить точку останова в onCreate второго действия? Возможно, это просто неправильный findViewById там… Кроме того, если вы сделаете свой класс Contact сериализуемым или распределяемым, вы можете передать весь объект через intent вместо передачи всех полей по отдельности.
3. Итак, что происходит при нажатии? Вызывается ли код в вашем
onClickListener
? Есть ли исключения в logcat? Установите точки останова или добавьте ведение журнала отладки в свой код, чтобы увидеть, что происходит.
Ответ №1:
В этом случае не рекомендуется запускать другое действие. Взгляните на фрагмент основной информации
Но если вам действительно нужно запустить SecondActivity, вам следует изменить свой код следующим образом:
@Override
public void onBindViewHolder(ContactAdapter.ViewHolder holder, final int position) {
final Contact contact = contacts.get(position);
holder.imageView.setImageResource(contact.getImage());
holder.nameView.setText(contact.getName());
holder.numberView.setText(contact.getNumber());
//remove holder.itemView.setOnClickListener
}
@Override
public int getItemCount() {
return contacts.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
final ImageView imageView;
final TextView nameView, numberView;
ViewHolder(View view) {
super(view);
imageView = view.findViewById(R.id.image);
nameView = view.findViewById(R.id.name);
numberView = view.findViewById(R.id.number);
//Set listener here
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final Contact contact = contacts.get(getAdapterPosition());
//Your code here
}
});
}
}
}
Комментарии:
1. #Александр Рябов, hello. Не могли бы вы, пожалуйста, объяснить, почему запускать другое действие в этом случае не очень хорошая идея? Спасибо.
Ответ №2:
Вы никогда не инициализируете context
объект в конструкторе ContactAdapter
класса:
//the constructor
public ContactAdapter(Context context, List<Contact> contacts) {
this.contacts = contacts;
this.layoutInflater = LayoutInflater.from(context);
//add this
this.context = context;
}
Также при нажатии на элемент инициализируйте намерение следующим образом:
Intent intent = new Intent(context , SecondActivity.class);
Вместо этого:
Intent intent = new Intent(view.getContext(), SecondActivity.class);
Комментарии:
1. #Хасан Бу Таам, спасибо за совет. Но я получаю ту же ошибку.