recyclerview desplegable context card android android-recyclerview android-menu recycler-adapter

desplegable - swipe menu recyclerview android



Android: cambie el contador de la insignia del menú del carrito desde el Adaptador Recycler (4)

Estoy intentando desarrollar el tipo de aplicación de comercio electrónico en la que el usuario puede agregar un artículo al carro. Pero no puedo actualizar el contador de insignia del carrito desde el adaptador. Aquí está la captura de pantalla de mi aplicación.

Estoy usando la vista de Recycler dentro del fragmento. Y estoy refiriendo este enlace a continuación para el conteo de elementos del menú.

https://mobikul.com/adding-badge-count-on-menu-items-like-cart-notification-etc/

Mi problema es que no puedo acceder al elemento del menú desde el adaptador.

Aquí está mi código de fragmento.

PriceListFragment.java

public class PriceListFragment extends Fragment { public ArrayList<Design> designList; private Single_DesignAdapter adapter; private RecyclerView recyclerView; public PriceListFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment setHasOptionsMenu(true); View v = inflater.inflate(R.layout.fragment_price_list, container, false); recyclerView = (RecyclerView)v.findViewById(R.id.pl_recycler_view); designList = new ArrayList<Design>(); designList = list(); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setHasFixedSize(true); adapter = new Single_DesignAdapter(getContext(), designList); recyclerView.setAdapter(adapter); return v; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.cart_menu, menu); super.onCreateOptionsMenu(menu, inflater); MenuItem itemCart = menu.findItem(R.id.menu_cart); LayerDrawable icon = (LayerDrawable) itemCart.getIcon(); setBadgeCount(getContext(), icon, 0); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_cart: Toast.makeText(getActivity(), "cart", Toast.LENGTH_SHORT). show(); return false; default: break; } return false; } public ArrayList<Design> list() { ArrayList<Design> arrayList = new ArrayList<Design>(); Design design = new Design(); design.name = "Black"; design.image = "http://website/Demo/images/1.jpg"; design.designName = "11001"; design.qualityName = "Cotton"; design.amount = "1000"; design.discPercent = "5"; Design design2 = new Design(); design2.name = "Green"; design2.image = "http://website/Demo/images/2.jpg"; design2.designName = "11001"; design2.qualityName = "Cotton"; design2.amount = "900"; design2.discPercent = "9"; arrayList.add(design); arrayList.add(design2); return arrayList; } public static void setBadgeCount(Context context, LayerDrawable icon, int count) { BadgeDrawable badge; // Reuse drawable if possible Drawable reuse = icon.findDrawableByLayerId(R.id.ic_badge); if (reuse != null && reuse instanceof BadgeDrawable) { badge = (BadgeDrawable) reuse; } else { badge = new BadgeDrawable(context); } badge.setCount(count); icon.mutate(); icon.setDrawableByLayerId(R.id.ic_badge, badge); } }

El diseño es mi clase de modelo

Design.java

public class Design implements Serializable{ public String id; public String qualityId; public String qualityName; public String designId; public String designName; public String image; public String name; //use as shade name public String discPercent; public String amount; public String pcs; public String qty; }

Single_DesignAdapter.java

public class Single_DesignAdapter extends RecyclerView.Adapter<Single_DesignAdapter.ViewHolder> { public ArrayList<Design> designList; private Context context; private LayoutInflater layoutInflater; public Single_DesignAdapter(Context context, ArrayList<Design> designList) { this.designList = designList; this.context = context; this.layoutInflater = LayoutInflater.from(context); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = layoutInflater.inflate(R.layout.single_design, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { Design design = designList.get(position); holder.tvQuality.setText(design.qualityName); holder.tvDesign.setText(design.designName); holder.tvShade.setText(design.name); if (!design.discPercent.equals("0")) { holder.tvDisPer.setText("-"+design.discPercent+"%"); holder.tvAmount.setPaintFlags(holder.tvAmount.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); int a = Integer.parseInt(design.amount); float b = Float.parseFloat(design.discPercent) / 100; holder.tvAmount.setText("₹ " + design.amount); int c = (int) (a * b); int d = a-c; holder.tvDiscAmt.setText("₹ " +d); Picasso.with(context).load(design.image).into(holder.ivDesign); } else { holder.tvAmount.setText("₹ " + design.amount); Picasso.with(context).load(design.image).into(holder.ivDesign); holder.tvDisPer.setVisibility(View.INVISIBLE); holder.tvDiscAmt.setVisibility(View.INVISIBLE); } holder.btAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { holder.llAdd.setVisibility(View.GONE); holder.llPlusMinus.setVisibility(View.VISIBLE); } }); holder.btPlus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (Integer.parseInt(holder.btPcsCount.getText().toString()) >= 1) { int a = Integer.parseInt(holder.btPcsCount.getText().toString()); int x = a++; holder.btPcsCount.setText(Integer.toString(a)); } } }); holder.btMinus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (Integer.parseInt(holder.btPcsCount.getText().toString()) <= 1) { holder.llAdd.setVisibility(View.VISIBLE); holder.llPlusMinus.setVisibility(View.GONE); } else { int a = Integer.parseInt(holder.btPcsCount.getText().toString()); a--; holder.btPcsCount.setText(Integer.toString(a)); } } }); } @Override public int getItemCount() { return designList.size(); } public class ViewHolder extends RecyclerView.ViewHolder { public LinearLayout llPer, llAdd, llPlusMinus; public Button btPlus, btMinus, btPcsCount, btAdd; public ImageView ivDesign; public TextView tvDesign, tvQuality, tvShade, tvAmount, tvDiscAmt, tvDisPer; public ViewHolder(View itemView) { super(itemView); btPlus = (Button) itemView.findViewById(R.id.btPlus); //other find view by ids } } }

Ahora cuando el usuario agrega el artículo al carrito, debe incrementar el contador. Agregaré todos los artículos del carro en ArrayList<Design> y luego guardaré esta lista en preferencia compartida. Gestionaré todo, pero no entiendo cómo puedo actualizar el contador del carrito desde el adaptador. No puedo acceder al menú en el adaptador. Si hay otra manera de hacer esto, por favor ayuda.


Como ya tiene un Context en su Adapter . Puedes lanzar eso a la Activity . De esta forma tienes acceso al menú.

//when item is added or removed ((Activity)this.context).invalidateOptionsMenu()

En su Fragment.onCreateOptionsMenu puede continuar y establecer el recuento de elementos


En tu fragmento, haz clic en el evento:

((MainActivity) getActivity()).createCartBadge("value");

Tu actividad contiene este método:

public void createCartBadge(int i) { MenuItem cartItem = mToolbarMenu.findItem(R.id.cart); LayerDrawable localLayerDrawable = (LayerDrawable) cartItem.getIcon(); Drawable cartBadgeDrawable = localLayerDrawable .findDrawableByLayerId(R.id.ic_badge); BadgeDrawable badgeDrawable; if ((cartBadgeDrawable != null) && ((cartBadgeDrawable instanceof BadgeDrawable)) && (i < 10)) { badgeDrawable = (BadgeDrawable) cartBadgeDrawable; } else { badgeDrawable = new BadgeDrawable(MainActivity.this); } badgeDrawable.setCount(i); localLayerDrawable.mutate(); localLayerDrawable.setDrawableByLayerId(R.id.ic_badge, badgeDrawable); cartItem.setIcon(localLayerDrawable); }


Puede usar el estilo de insignia en TextView ahora. Todo lo que necesita hacer es ajustar su posición de vista de texto para que se vea como insignia.

<TextView android:id="@+id/fabCounter" style="@style/Widget.Design.FloatingActionButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:layout_marginEnd="10dp" android:padding="5dp" android:text="-9" android:textColor="@android:color/black" android:textSize="14sp" />


Puede usar la Interface para comunicarse entre el Fragment y el Adapter .

por ejemplo:

public interface CallbackInterface { void onCall(); }

y en su PriceListFragment en onCreateView haga eso:

CallbackInterface callback = new CallbackInterface{ @Override public void onCall() { if(itemCart!=null){ //code to increment badge } } };

y pase la callback de callback al constructor del adaptador y luego utilícelo allí.