Начать просмотр активности из адаптера просмотра переработчика в Android Studio

Действие, которое я пытаюсь вызвать из адаптера представления переработчика, не запускается. Вместо этого оно либо завершает приложение, либо просто возвращается в основное меню.

Я пытаюсь переключиться с одного элемента BookRecyclerViewAdapter на BookActivity. Это часть курса udemy, и я скопировал код из курса один за другим, но на моем виртуальном устройстве новое действие не открывается, а просто возвращается к основному действию. Это код в адаптере:

public class BookRecViewAdapter extends RecyclerView.Adapter<BookRecViewAdapter.ViewHolder> {
    private static final String TAG = "BookRecViewAdapter";

    private ArrayList<Book> books = new ArrayList<>();
    private Context mContext;

    public BookRecViewAdapter(Context mContext) {
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_book, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") int position) {
        Log.d(TAG, "onBindViewHolder: Called");
        holder.txtName.setText(books.get(position).getName());
        Glide.with(mContext)
                .asBitmap()
                .load(books.get(position).getImageURL())
                .into(holder.imgBook);

        holder.parent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(mContext, BookActivity.class);
                mContext.startActivity(intent);
            }
        });

Представление переработчика вызывается здесь:

public class AllBooksActivity extends AppCompatActivity {

    private RecyclerView booksRecView;
    private BookRecViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_all_books);

        adapter = new BookRecViewAdapter(this);
        booksRecView = findViewById(R.id.booksRecView);

        booksRecView.setAdapter(adapter);
        booksRecView.setLayoutManager(new LinearLayoutManager(this ));

А это новое занятие:

public class BookActivity extends AppCompatActivity {

    private TextView txtBookName, txtAuthor, txtPages, txtDescription;
    private Button btnAddToWantToRead, btnAddToAlreadyRead, btnAddToCurrentlyReading, btnAddToFavourite;
    private ImageView bookImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);

        initViews();

У вас тоже BookActivity заявлено в AndroidManifest.xml?

Miroslav Hýbler 09.06.2024 15:16

а также можете ли вы поделиться кодом, в котором вы вызвали функцию bookRecyclerView?

Laser 10.06.2024 15:03

@MirlavHýbler Да, там заявлено так же, как и другие виды деятельности.

Decimus Sutor 10.06.2024 17:11

@Laser Shure, я отредактировал вопрос для этого.

Decimus Sutor 10.06.2024 17:16

вы пытались ввести код в своем AllBooksActivity?. Используя интерфейс адаптера.

Laser 11.06.2024 15:19

@Laser, ты имеешь в виду вставить весь RecViewAdapter в AllBooksAktivity, или в BookActivity, или в оба?

Decimus Sutor 13.06.2024 14:34

@DecimusSutor нет, я имею в виду создание интерфейса в классе адаптера, а затем вызов его в классе активности.

Laser 14.06.2024 06:36
0
7
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, создайте такой интерфейс в своем классе адаптера.

public class BookRecViewAdapter extends RecyclerView.Adapter<BookRecViewAdapter.ViewHolder> {
    private static final String TAG = "BookRecViewAdapter";
    private OnItemClickListener listener; //create a variable listner.

    private ArrayList<Book> books = new ArrayList<>();
    private Context mContext;

    public BookRecViewAdapter(Context mContext) {
        this.mContext = mContext;
    }

    // create a method to initialize the listener.
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }

    //creating an interface
    public interface OnItemClickListener {
        void onClick();
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_book, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") int position) {
        Log.d(TAG, "onBindViewHolder: Called");
        holder.txtName.setText(books.get(position).getName());
        Glide.with(mContext)
                .asBitmap()
                .load(books.get(position).getImageURL())
                .into(holder.imgBook);

        holder.parent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               //instead of changing activity here do this.
               if (listener != null) {
                    listener.onClick();
                }
            }
        });

Затем в действии, в котором вы используете адаптер, просто вызывайте интерфейс и переключайтесь между действиями.

 adapter.setOnItemClickListener(new BookRecViewAdapter.OnItemClickListener() {
            @Override
            public void onClick() {
                 Intent intent = new Intent(YourActivity.this, BookActivity.class);
                 startActivity(intent);
            }
        });

Это должно решить вашу проблему.

Другие вопросы по теме