При нажатии на элемент RecyclerView отображается новое действие с информацией об этом элементе

#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. #Хасан Бу Таам, спасибо за совет. Но я получаю ту же ошибку.