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í.