0

I have added cart image in my Adapter class but whenever I click on the button always get the last element from the list. Here is my adapter class and activity class. Details are perfectly fetched from firebase and Log file showing list of menu.

Here is my MenuAdapter.java class.

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {

private Context mCtx;
private List<Menu> menuList;
private ItemClickEvent itemclick;


public MenuAdapter(Context mCtx, List<Menu> menuList, ItemClickEvent itemclick) {
    this.mCtx = mCtx;
    this.menuList = menuList;
    this.itemclick = itemclick;
}

@NonNull
@Override
public MenuViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) 
{
    View view = LayoutInflater.from(mCtx).inflate(R.layout.menu_list, viewGroup, false);
    return new MenuViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final MenuViewHolder menuViewHolder, final int i) {
    final Menu menu = menuList.get(i);
    menuViewHolder.itemName.setText(menu.itemName);
    menuViewHolder.itemPrice.setText(menu.itemPrice);
    menuViewHolder.addCart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            itemclick.imageClicked(menu);
        }
    });
}

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

public class MenuViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView itemName, itemPrice;
    @SuppressLint("StaticFieldLeak")
    ImageView addCart;

    MenuViewHolder(@NonNull View itemView) {
        super(itemView);

        itemName = itemView.findViewById(R.id.itemName);
        itemPrice = itemView.findViewById(R.id.itemPrice);
        addCart = itemView.findViewById(R.id.menuAddCart);
        //addCart.setOnClickListener(this);
        itemView.setOnClickListener(this);


    }

    @Override
    public void onClick(View v) {


    }

}

}

and this MenuActivity.java class

public class MenuActivity extends AppCompatActivity implements ItemClickEvent 
{

private ActionBar toolbar;
List<Menu> menuList;
RecyclerView recyclerView;
MenuAdapter adapter;
DatabaseReference databaseReference;
ProgressBar progressBar;
Menu menu;
int foodId = 1;
int cat;
String id,itemName, itemPrice;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_menu);
    Intent intent = getIntent();
    final String category = intent.getStringExtra("cat_id");
    final String catName = intent.getStringExtra("cat_name");
    toolbar = getSupportActionBar();
    toolbar.setTitle(catName);
    cat = Integer.parseInt(category) - 1;

    menuList = new ArrayList<>();
    recyclerView = findViewById(R.id.menu_recycler);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new MenuAdapter(this, menuList,this);
    recyclerView.setAdapter(adapter);
    ImageView addTCart = findViewById(R.id.menuAddCart);
    progressBar = findViewById(R.id.progressBarLoading);
    databaseReference = FirebaseDatabase.getInstance().getReference("foods/" + cat + "/menu-items");
    // fetchMenu(category);
    progressBar.setVisibility(View.VISIBLE);
    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() 
{
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            progressBar.setVisibility(View.GONE);
            if (dataSnapshot.exists()) {
                for (DataSnapshot wallpaperSnapshot : dataSnapshot.getChildren()) {

                    id = wallpaperSnapshot.getKey();
                    itemName = wallpaperSnapshot.child("name").getValue(String.class);
                    itemPrice = wallpaperSnapshot.child("price").getValue(String.class);

                    menu = new Menu(id, itemName, itemPrice, category);

                    menuList.add(menu);
                    Log.d("FOOD-DETAIL", String.valueOf(menu));
                }
                adapter.notifyDataSetChanged();
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


}

@Override
public void imageClicked(Menu m) {
    new Database(getApplicationContext()).addToCart(new Order(
            Integer.parseInt(id),
            menu.getItemName(),
            "1",
            menu.getItemPrice()
    ));
    foodId += 1;
    Toast.makeText(getBaseContext(), itemName+" added to cart", Toast.LENGTH_SHORT).show();

}

@Override
public void viewClicked() {

}
}
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
shukla147
  • 74
  • 1
  • 8

2 Answers2

0

Hello try making these changes in imageClicked() in MenuActivity

@Override
 public void imageClicked(Menu m) {
    new Database(getApplicationContext()).addToCart(new Order(
            m.getId(),
            m.getItemName(),
            "1",
            m.getItemPrice()
    ));
    foodId += 1;
    Toast.makeText(getBaseContext(), itemName+" added to cart", Toast.LENGTH_SHORT).show();

}
Basha K
  • 1,509
  • 1
  • 11
  • 16
0

There should be more efficient way to set listener. Just set that listener (same way as it is now) in constructor of MenuViewHolder and assign to this. And in method onClick - check R.id of view and if it is addCart instead of calling itemclick.imageClicked(menu) just call item.click.imageClicked(getAdapterPosition())

This because onBindViewHolder() is calling multiple times and you will still create new listener. But in constructor you create that listener only if you need new MenuViewHolder and use the actual position of adapter.

  • Thank you for your suggestion! I will consider your suggestion – shukla147 Dec 07 '18 at 16:28
  • maybe this would be useful for you https://stackoverflow.com/questions/33845846/why-is-adding-an-onclicklistener-inside-onbindviewholder-of-a-recyclerview-adapt?answertab=votes#tab-top – Michal Sutka Dec 07 '18 at 16:36