0

I have list (list of novels) that needs to show on a recycler view, I am implementing an event listener for each item in the list, every novel list contain books. I want to show book details in a separate activity (DetailActivity) when a item is clicked.

Should make another adapter or not ? please help me

I am stuck to add nested array list, because I have ItemAdapter, which has a constructor which only accept a novel list and list does not contain any books.


    private ArrayList<Pemodelan_Item> dataNovelist() {

        ArrayList<Pemodelan_Item> list = new ArrayList<>();
        list.add(new Pemodelan_Item("Fiersa Besari.", "Bandung", R.drawable.fiersa, R.drawable.bandung_3, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Ahmad Fuadi", "Sumatra Barat", R.drawable.ahmad, R.drawable.sumbar_2, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Pidi Baiq", "Bandung", R.drawable.pidi, R.drawable.bandung_2, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Andrea Hirata", "Belitung", R.drawable.andrea, R.drawable.belitung, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Tere Liye", "Makasar", R.drawable.tereliye, R.drawable.makasar, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Dee Lestari", "Bandung", R.drawable.dee, R.drawable.bandung, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Boy Candra", "Sumatra Barat", R.drawable.boycandra, R.drawable.sumbar, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Pramoedya Ananta Toer", "Jakarta", R.drawable.toer, R.drawable.jkt, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Erisca Febriani", "Lampung", R.drawable.erisca, R.drawable.lampung, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("habiburrahman el shirazy", "Semarang", R.drawable.habiburahman, R.drawable.semarang, R.string.long_desc_andrea));
        return list;
    }


package com.example.submission_novelist;


import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {

    private ArrayList<Pemodelan_Item> novelists;
    private Context mContext;
    private OnItemClickCallback onItemClickCallback;

    public void setOnItemClickCallback(OnItemClickCallback onItemClickCallback){
        this.onItemClickCallback = onItemClickCallback;
    }

    public ItemAdapter(Context context, ArrayList<Pemodelan_Item> novelistss) {
        this.novelists = novelistss;
        mContext = context;
    }


    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_layout, viewGroup, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, int i) {
        Pemodelan_Item pemodelan_item = novelists.get(i);
        viewHolder.tvNovelist.setText(pemodelan_item.getmNovelist());
        viewHolder.tvAsal.setText(pemodelan_item.getmAsal());
        viewHolder.ivNovelist.setImageResource(pemodelan_item.getmImgNovelist());
        viewHolder.ivCardBack.setImageResource(pemodelan_item.getmImgCardBackground());
        viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                Toast.makeText(viewHolder.cardView.getContext(), "saya" + novelists.get(viewHolder.getAdapterPosition()).getmNovelist(), Toast.LENGTH_SHORT).show();
           onItemClickCallback.onItemClicked(novelists.get(viewHolder.getAdapterPosition()));
            }
        });
    }

    @Override
    public int getItemCount() {
        if (novelists != null) {
            return novelists.size();
        } else {
            return 0;
        }
    }


    public class ViewHolder extends RecyclerView.ViewHolder {
        public View v;
        public TextView tvNovelist;
        public TextView tvAsal;
        public ImageView ivNovelist;
        public ImageView ivCardBack;
        public CardView cardView;

        public ViewHolder(View itemView) {
            super(itemView);
            this.v = itemView;
            tvNovelist = v.findViewById(R.id.novelist_text_view);
            tvAsal = v.findViewById(R.id.asal_text_view);
            ivNovelist = v.findViewById(R.id.novelist_image_view);
            ivCardBack = v.findViewById(R.id.cardViewBackground);
            cardView = v.findViewById(R.id.myCardView);

        }
    }

    public interface OnItemClickCallback{
        void onItemClicked(Pemodelan_Item pemodelan_item);
    }
}
user158
  • 12,852
  • 7
  • 62
  • 94

2 Answers2

0

What you could do is following

1. Change your model class

Novelist.java

public class Novelist {

   private String writerName;
   private int writerImage;
   private String city;
   private int cityImage;
   private String description;
   private ArrayList<Book> books;

   public Novelist(String writerName, int writerImage, String city, int cityImage, String description, ArrayList<Book> books){

        this.writerName = writerName;
        this.writerImage = writerImage;
        this.city = city;
        this.cityImage = cityImage;
        this.description = description;
        this.books = books;
   }
   // property setters, getters here    
}

Book.java

public class Book{
     private String bookTitle;
     private int bookImage;
     private String description;
     private double price;

     public Book(String bookTitle, int bookImage, String description, double price){
          this.bookTitle = bookTitle;
          this.bookImage = bookImage;
          this.description = description;
          this.price = price;
     }
     // property setters, getters here
}

2. It is good to have a recycler view in DetailActivity if you have lots of items (good for performance), so you need an another adapter class (ex: BookItemAdapter)

3. Pass books through an intent

MainActivity.java

@Override
public onItemClickCallback(Novelist novelist){

    Intent intent = new Intent(getBaseContext(), DetailActivity.class);
    intent.putExtra("books", novelist.books);
    startActivity(intent);
}

DetailActivity.java

private ArrayList<Book> books;
private BookItemAdapter bookItemAdapter;

@Override
public void onCreate(Bundle savedInstanceState){
    ...
    books = getIntent("books");
    bookItemAdapter = BookItemAdapter(books)
    ...
}

Improvements

Set your clicklistener in onCreateViewHolder as a best practice. ( Read here )

public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i){

     View view = LayoutInflater.from(viewGroup.getContext());

     view.setOnClickListener(new View.OnClickListener(){

     @Override
     public void onClick(View v){
         onItemOnClickCallback.onItemClicked(novelists.get(holder.getAdapterPosition()));
     }
  });

     ViewHolder holder =  ViewHolder(view);
}
user158
  • 12,852
  • 7
  • 62
  • 94
0

user158 has a great answer.

In short, Yes, you would need to create a new Books Adapter to handle the List of books you get from the current Novelist item. So after your item is clicked, start your DetailsActivity and pass the list of books through with the Intent. Then create a new Books Recycler and a new Books Adapter and pass in the list of books.

Hope you get it figured out!

  • i want to show book each a novelist, ex Andrea hinata has book like Laskar Pelangi and Sang pemimpi. when i clicked listItem, intent to detail activity a recycle view only show book corresponding with a novelist – Rafly Hernandes Aug 28 '19 at 03:46