繁体   English   中英

如何处理嵌套recyclerview中recyclerview子项中每个项目的点击事件

[英]how to handle click event for each item in recyclerview child in nested recyclerview

我有一个嵌套的回收视图来显示每个类别中的食物列表。 当用户点击增加或减少按钮时,数量将更新为数量 textview 并同步到数据库中存储的购物车,但目前我不知道如何监听用户点击这些按钮时的事件。

这是我当前运行时的用户界面:在此处输入图像描述

这是我的片段:

public class TabOrderFragment extends Fragment {

    private static final String ARG_RESTAURANT_ID = "restaurantId";
    private int restaurantId;

    View view;
    RecyclerView menuRecyclerView;
    RecyclerView.LayoutManager layoutManager;

    ArrayList<Menu> menuArrayList;
    MenuAdapter menuAdapter;

    public TabOrderFragment() { }

    public static TabOrderFragment newInstance(int restaurantId) {
        TabOrderFragment fragment = new TabOrderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_RESTAURANT_ID, restaurantId);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            restaurantId = getArguments().getInt(ARG_RESTAURANT_ID);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_tab_order, container, false);

        if(restaurantId != 0) {
            DatabaseHandler databaseHandler = DatabaseHandler.getInstance(getActivity());
            menuArrayList = new ArrayList<Menu>();
            menuArrayList = databaseHandler.getAllMenuFoodsByIdRestaurant(restaurantId);
            menuRecyclerView = view.findViewById(R.id.rcv_foods_menu);
            menuAdapter = new MenuAdapter(getActivity().getApplicationContext(), restaurantId);
            layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
            menuRecyclerView.setLayoutManager(layoutManager);
            menuAdapter.setData(menuArrayList);
            menuRecyclerView.setAdapter(menuAdapter);
        }

        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Log.d("TabOrderFragment", "Restaurant Id = " + restaurantId);
    }

这是我的 MenuAdapter:

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {
    Context context;
    private int restaurantId;

    private RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();
    ArrayList<Menu> menuList;

    public MenuAdapter(ArrayList<Menu> menuList) {
        this.menuList = menuList;
    }

    public MenuAdapter(Context context, int restaurantId) {
        this.context = context;
        this.restaurantId = restaurantId;
    }

    public void setData(ArrayList<Menu> menuList) {
        this.menuList = menuList;
        notifyDataSetChanged();
    }

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

    @Override
    public void onBindViewHolder(@NonNull MenuViewHolder holder, int position) {
        Menu menu = menuList.get(position);
        holder.txtMenuTitle.setText(menu.getTitle().concat(" (" + String.valueOf(menu.getQuantity()) + ")"));

        LinearLayoutManager layoutManager = new LinearLayoutManager(holder.rcvListFoods.getContext(), LinearLayoutManager.VERTICAL, false);
        layoutManager.setInitialPrefetchItemCount(menu.getFoods().size());
        FoodAdapter foodAdapter = new FoodAdapter(menu.getFoods(), restaurantId);

        holder.rcvListFoods.setLayoutManager(layoutManager);
        holder.rcvListFoods.setAdapter(foodAdapter);
        holder.rcvListFoods.setRecycledViewPool(viewPool);
    }

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

    public class MenuViewHolder extends RecyclerView.ViewHolder {

        private TextView txtMenuTitle;
        private RecyclerView rcvListFoods;

        public MenuViewHolder(@NonNull View itemView) {
            super(itemView);
            txtMenuTitle = itemView.findViewById(R.id.txv_menu_title);
            rcvListFoods = itemView.findViewById(R.id.rcv_list_foods);
        }
    }
}

这是我的 FoodAdapter:

public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.FoodViewHolder> {

    private ArrayList<Food> foodList;
    private int restaurantId;
    private int userId;

    SharedPreferences sharedPreferences;

    public FoodAdapter(ArrayList<Food> foodList, int restaurantId) {
        this.foodList = foodList;
        this.restaurantId = restaurantId;
    }

    @NonNull
    @Override
    public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        sharedPreferences = fragmentActivity.getSharedPreferences("currentUser", Context.MODE_PRIVATE);
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_food, parent, false);
        return new FoodViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull FoodViewHolder holder, int position) {
        Food food =foodList.get(position);
        Picasso.get().load(food.getThumbImage()).into(holder.foodThumbImage);
        holder.foodName.setText(food.getName());
        holder.foodDescription.setText(food.getDescription());
        double price = Double.parseDouble(food.getPrice());
        DecimalFormat formatter = new DecimalFormat("#,###");
        holder.foodPrice.setText(formatter.format(price) + "đ");

        

    }

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

    public class FoodViewHolder extends RecyclerView.ViewHolder {

        private ImageView foodThumbImage;
        private TextView foodName;
        private TextView foodDescription;
        private TextView foodPrice;
        private TextView quantity;
        private MaterialButton increaseBtn;
        private MaterialButton decreaseBtn;

        private ItemClickListener itemClickListener;

        public FoodViewHolder(@NonNull View itemView) {
            super(itemView);
            foodThumbImage = itemView.findViewById(R.id.image_food);
            foodName = itemView.findViewById(R.id.txv_food_name);
            foodDescription = itemView.findViewById(R.id.txv_food_description);
            foodPrice = itemView.findViewById(R.id.txv_food_price);
            quantity = itemView.findViewById(R.id.txv_quantity);
            increaseBtn = itemView.findViewById(R.id.btn_increase);
            decreaseBtn = itemView.findViewById(R.id.btn_decrease);
        }


    }

在你的食物适配器的 onBindViewHolder 方法中使用

holder.increaseBtn.setOnClickListener{
    onIncreaseClick()
}

同时创建一个界面

interface Listener{
    public void onIncreaseClick();
    public void onDecreaseClick();
}

并在您的活动或片段或视图模型中实现您的界面,您可以在其中收听点击事件

当你有类似的东西时,你通常可以做的是创建一个与 Recycler 视图交互的界面:

interface Interaction {
    public void onFoodClick(Food food)
}

然后你在你的recycler视图适配器中添加这个接口的一个实例,你让你的活动或片段实现这个接口,请在这里找到一个很好的解释: https://stackoverflow.com/a/31671289/7334951

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM