получение последнего элемента из списка - при нажатии на кнопку добавления в Recyclerview - PullRequest
0 голосов
/ 07 декабря 2018

Я добавил изображение корзины в свой класс Adapter, но всякий раз, когда я нажимаю на кнопку, всегда получаю последний элемент из списка.Вот мой класс адаптера и класс активности.Подробности прекрасно извлекаются из Firebase и файла журнала, показывая список меню.

Вот мой класс MenuAdapter.java.

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


    }

}

}

и этот класс MenuActivity.java

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

}
}

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Должен быть более эффективный способ настройки слушателя.Просто установите этот слушатель (так же, как сейчас) в конструкторе MenuViewHolder и присвойте ему.А в методе onClick - проверьте R.id представления и, если это addCart вместо вызова itemclick.imageClicked (menu), просто вызовите item.click.imageClicked (getAdapterPosition ())

Это потому, что onBindViewHolder () вызываетнесколько раз, и вы все равно будете создавать новый слушатель.Но в конструкторе вы создаете этот слушатель только в том случае, если вам нужен новый MenuViewHolder и используется фактическое положение адаптера.

0 голосов
/ 07 декабря 2018

Здравствуйте, попробуйте внести эти изменения в imageClicked () в 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();

}
...