galaxyan12
galaxyan12

Reputation: 26

App crash using RecyclerView in Fragment no error in lines

I used a recyclerView on my app to display array items. Until I changed it, it worked fine when it was implemented in the "MainActivity.java".

I want my app to have a "BottomNavigationBar" But, when i start the app it just crash

This is the fragment code :

public class HomeFragment extends Fragment {

    private RecyclerView rvProduk;
    private ArrayList<Produk> list = new ArrayList<>();

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_home, container, false);
        rvProduk = v.findViewById(R.id.rv_produk);
        rvProduk.setHasFixedSize(true);
        list.addAll(ProdukData.getListData());
        showRecyclerView();
        return v;
    }

    private void showRecyclerView(){
        rvProduk.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        ProdukAdapter produkAdapter = new ProdukAdapter();
        rvProduk.setAdapter(produkAdapter);
    }
}

this is the MainActivity :

public class MainActivity extends AppCompatActivity {

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

        BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
        bottomNavigationView.setOnNavigationItemReselectedListener((BottomNavigationView.OnNavigationItemSelectedListener) navListener);
    }

    private BottomNavigationView.OnNavigationItemReselectedListener navListener =
            new BottomNavigationView.OnNavigationItemReselectedListener() {
                @Override
                public void onNavigationItemReselected(@NonNull MenuItem menuItem) {
                    Fragment selectedFragment = new HomeFragment();

                    switch (menuItem.getItemId()) {
                        case R.id.nav_home:
                            selectedFragment = new HomeFragment();
                            break;
                        case R.id.nav_feed:
                            selectedFragment = new FeedFragment();
                            break;
                        case R.id.nav_profile:
                            selectedFragment = new ProfileFragment();
                            break;
                    }

                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                            selectedFragment).commit();
                }
            };
}

and the Adapter :

public class ProdukAdapter extends RecyclerView.Adapter<ProdukAdapter.ProdukViewHolder> {
    private ArrayList<Produk> listProduk;

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

    @Override
    public void onBindViewHolder(@NonNull final ProdukViewHolder holder, final int position) {
        final Produk produk = listProduk.get(position);

        Glide.with(holder.itemView.getContext())
                .load(produk.getPhoto())
                .apply(new RequestOptions().override(350, 550))
                .into(holder.imgPhoto);

        holder.tvName.setText(produk.getName());
        holder.tvDetail.setText(produk.getDetail());
        holder.btnDetail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent moveIntent = new Intent(holder.itemView.getContext(), DetailActivity.class);
                moveIntent.putExtra(DetailActivity.PRODUK_NAME, produk.getName());
                moveIntent.putExtra(DetailActivity.PRODUK_DETAIL, produk.getDetail());
                moveIntent.putExtra("photo", listProduk.get(position).getPhoto());
                holder.itemView.getContext().startActivity(moveIntent);
            }
        });
    }

    @Override
    public int getItemCount() {
        return listProduk.size();
    }

    public class ProdukViewHolder extends RecyclerView.ViewHolder {
        ImageView imgPhoto;
        TextView tvName, tvDetail;
        Button btnBuy, btnDetail;

        ProdukViewHolder(View itemView){
            super(itemView);
            imgPhoto = itemView.findViewById(R.id.img_item_photo);
            tvName = itemView.findViewById(R.id.tv_item_name);
            tvDetail = itemView.findViewById(R.id.tv_item_detail);
            btnBuy = itemView.findViewById(R.id.btn_set_buy);
            btnDetail = itemView.findViewById(R.id.btn_set_detail);
        }
    }
}

Can anyone help me with this? i'm still learning on android

Upvotes: 0

Views: 99

Answers (1)

Shakib Uz-Zaman
Shakib Uz-Zaman

Reputation: 621

You haven't sent any data to the ProdukAdapter. You should create a constructor inside ProdukAdapter and pass your list. I think you are getting NullPointerException in your code. Btw, you should always share your log with a question such as these.

Try changing your code as below

Fragment

private void showRecyclerView(){

rvProduk.setLayoutManager(new LinearLayoutManager(this.getActivity()));
 ProdukAdapter produkAdapter = new ProdukAdapter(list);
 rvProduk.setAdapter(produkAdapter); 
}

Adapter

public class ProdukAdapter extends RecyclerView.Adapter<ProdukAdapter.ProdukViewHolder> {

 private ArrayList<Produk> listProduk; 

public ProdukAdapter(ArrayList<Produk> listProduk)
{
this.listProduk=listProduk
}

................

}

Upvotes: 1

Related Questions