androidandroid-recyclerviewandroid-activity

start view activity from recycler view adapter in Android Studio


The activity I try to call out of a recycler view adapter doesn't start. Instead it either ends the app or just goes back to main.

I am trying to switch from one item in the BookRecyclerViewAdapter to the BookActivity. It is part of a udemy course and i copied the code one by one from the course, but in my virtual device it doesn't open the new activity but it just goes back to the main activity. This is the Code in the adapter:

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);
            }
        });

The recicler view is called here:

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 ));

And this is the new activity:

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();

Solution

  • So Create an interface in your Adapter class like this.

    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();
                    }
                }
            });
    

    Then in the activity where you are using your adapter simply call the interface and switch between activities.

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

    This should solve your problem.