如何为RecyclerView商品添加操作实现工作线程优化?
Android应用主线程卡顿问题与工作线程优化方案需求
应用结构概述
- 包含2个Activity:主界面Activity、商店界面Activity
- 商店界面Activity包含2个Fragment,其中第一个Fragment内有两个RecyclerView:
- 购物车(初始为空):对应集合
spritesSelected - 食品列表(固定长度):对应集合
spritesList
- 购物车(初始为空):对应集合
用户操作流程
- 点击添加食品按钮:弹出包含食品列表RecyclerView的Dialog
- 点击食品列表项:弹出数量输入Dialog
- 输入数量并确认:更新购物车RecyclerView,添加对应食品
当前问题
整个操作流程均在主线程执行,导致耗时较长。尝试为整个流程分配线程,但未提升运行速度,寻求最优工作线程实现方案。
食品列表RecyclerView适配器中食品项点击事件代码
imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (spriteSelectedRVAInterface1 != null){ int position = getAdapterPosition(); if (position != RecyclerView.NO_POSITION){ Sprite s = spritesSelected.get(position); s.setVisibility(!s.visibility); spriteSelectedRVAInterface1.onItemClicked(position); } } } });
Fragment中实现的接口方法(重写onItemViewClicked)
@Override public void onItemViewClicked(Sprite sprite, Context context) { spriteAddDialog = new Dialog(context); spriteAddDialog.setContentView(R.layout.sprite_add_menu); spriteAddDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); ImageButton close = spriteAddDialog.findViewById(R.id.ib_close); EditText enter_amount = spriteAddDialog.findViewById(R.id.edt_enter_amount); Button add = spriteAddDialog.findViewById(R.id.b_add); enter_amount.setText(String.valueOf(sprite.defaultAmount)); close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { spriteAddDialog.dismiss(); } }); add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int amountEntered = Integer.parseInt(enter_amount.getText().toString()); int amountPresent = 0; try { amountPresent = spritesSelectedAmount.get(spritesSelected.indexOf(sprite)); } catch (Exception IndexOutOfBoundsException){ //do nothing } if (amountEntered + amountPresent > sprite.maxAmountSelected){ Toast.makeText(context, "Exceeded maximum limit of " + sprite.maxAmountSelected + " items.", Toast.LENGTH_LONG).show(); } else { spriteAddDialog.dismiss(); spriteListDialog.dismiss(); onAddButtonClick(sprite, amountEntered); } } }); spriteAddDialog.show(); }
onAddButtonClick方法代码
public int onAddButtonClick(Sprite s, int amount) { if (spritesSelected.size() != 0) { for (Sprite sprite : spritesSelected) { if (s == sprite) { int i = spritesSelected.indexOf(sprite); spritesSelectedAmount.set(i, spritesSelectedAmount.get(i) + amount); rva2.notifyItemChanged(i); return -1; } } } spritesSelected.add(s); spritesSelectedAmount.add(amount); rva2.notifyItemInserted(spritesSelected.size()-1); return 1; }
内容的提问来源于stack exchange,提问作者Soil Milk
相关产品推荐
相关产品推荐

