Java 从Recyclerview适配器类更新textview
我正在开发一个电子商务应用程序来下一些在线订单。在my Recyclerview中,有在上一个活动中添加的产品。在这里,我用诸如商品名称、数量、价格等详细信息填充Recyclerview中添加的产品。。有用于增加/减少每个产品数量的按钮,还有一个用于删除项目的按钮 在Recyclerview布局的底部,有另一个文本视图显示总计。当我处理RecycleServiceAdapter类中的按钮滑动时,当用户更新数量或删除项目时,我必须更新总计。我尝试了这里已经提到的一些解决方案,但是应用程序在随机点击按钮时崩溃。请提供解决方案或更好的方法 以下是我的适配器类:Java 从Recyclerview适配器类更新textview,java,android,android-recyclerview,e-commerce,Java,Android,Android Recyclerview,E Commerce,我正在开发一个电子商务应用程序来下一些在线订单。在my Recyclerview中,有在上一个活动中添加的产品。在这里,我用诸如商品名称、数量、价格等详细信息填充Recyclerview中添加的产品。。有用于增加/减少每个产品数量的按钮,还有一个用于删除项目的按钮 在Recyclerview布局的底部,有另一个文本视图显示总计。当我处理RecycleServiceAdapter类中的按钮滑动时,当用户更新数量或删除项目时,我必须更新总计。我尝试了这里已经提到的一些解决方案,但是应用程序在随机点击
public class InvoiceRecyclerViewAdapter extends RecyclerView.Adapter<InvoiceRecyclerViewAdapter.ViewHolder> {
private static final String TAG = "RecylerViewAdapter";
List<Products> addedProductsList;
Context mContext;
public InvoiceRecyclerViewAdapter(Context mContext,List<Products> addedProductsList)
{
this.mContext=mContext;
this.addedProductsList=addedProductsList;
}
public InvoiceRecyclerViewAdapter(Context mContext)
{
this.mContext=mContext;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_invoice,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
holder.item_qty.setText("1");
holder.itemname.setText(addedProductsList.get(position).getName());
holder.itemprice.setText("Rs "+addedProductsList.get(position).getPrice());
holder.itemdiscount.setText("Rs "+calculate_dis(position));
holder.itemtotal.setText("Rs "+calculate_total(position));
holder.button_inc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int qty = addedProductsList.get(position).getQty();
qty++;
addedProductsList.get(position).setQty(qty);
holder.item_qty.setText(""+qty);
holder.itemdiscount.setText("Rs "+calculate_dis(position));
holder.itemtotal.setText("Rs "+calculate_total(position));
UpdateTotal();
}
});
holder.button_dec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int qty = addedProductsList.get(position).getQty();
qty--;
if(qty>0){
addedProductsList.get(position).setQty(qty);
holder.item_qty.setText(""+qty);
holder.itemdiscount.setText("Rs"+calculate_dis(position));
holder.itemtotal.setText("Rs"+calculate_total(position));
UpdateTotal();
}
}
});
holder.button_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addedProductsList.get(position).setAddedTocart(false);
//notifyDataSetChanged();
addedProductsList.remove(position);
notifyItemRemoved(position);
UpdateTotal();
}
});
}
@Override
public int getItemCount() {
return addedProductsList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView itemname,itemtotal,itemprice,itemdiscount,item_qty;
Button button_cancel,button_inc,button_dec;
ConstraintLayout parent_layout;
public ViewHolder(View itemView) {
super(itemView);
itemname = itemView.findViewById(R.id.textView_item_name);
itemprice = itemView.findViewById(R.id.textView_item_price);
itemdiscount = itemView.findViewById(R.id.textView_item_discount);
itemtotal = itemView.findViewById(R.id.textView_item_total);
button_cancel = itemView.findViewById(R.id.button_cancel);
button_inc=itemView.findViewById(R.id.button_inc);
button_dec=itemView.findViewById(R.id.button_dec);
item_qty = itemView.findViewById(R.id.textView_qty);
parent_layout = itemView.findViewById(R.id.invoice_parent_layout);
}
}
private float calculate_dis(int pos){
float dis = 0;
if(addedProductsList.get(pos).isPrice_g_enabled()){
int qty=addedProductsList.get(pos).getQty();
dis = Float.parseFloat(addedProductsList.get(pos).getPrice())-Float.parseFloat(addedProductsList.get(pos).getPrice_g());
dis = qty*dis;
}
return dis;
}
private float calculate_total(int pos){
int qty=addedProductsList.get(pos).getQty();
float price,total;
if(addedProductsList.get(pos).isPrice_g_enabled()){
price = Float.parseFloat(addedProductsList.get(pos).getPrice_g());
}
else{
price= Float.parseFloat(addedProductsList.get(pos).getPrice());
}
total = price*qty;
return total;
}
private void UpdateTotal(){
TextView txtView =((EditQuantity)mContext).findViewById(R.id.textView_total);
float total=0,price=0;
int qty=0;
for(int i=0;i<addedProductsList.size();i++){
if(addedProductsList.get(i).isAddedTocart()) {
qty = addedProductsList.get(i).getQty();
if(addedProductsList.get(i).isPrice_g_enabled()){
price = Float.parseFloat(addedProductsList.get(i).getPrice_g());
}
else{
price= Float.parseFloat(addedProductsList.get(i).getPrice());
}
}
total=total+(qty*price);
}
txtView.setText("Rs "+total);
}
}
公共类InvoiceRecycleServiceAdapter扩展了RecyclerView.Adapter{
私有静态最终字符串TAG=“RecylerViewAdapter”;
产品列表;
语境;
公共发票回收服务适配器(上下文mContext,列表AddedProductList)
{
this.mContext=mContext;
此.addedProductsList=addedProductsList;
}
公共发票回收服务适配器(上下文mContext)
{
this.mContext=mContext;
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.layout\u发票,parent,false);
ViewHolder ViewHolder=新的ViewHolder(视图);
返回视图持有者;
}
@凌驾
public void onBindViewHolder(@NonNull final ViewHolder,final int position){
持有人项目数量设置文本(“1”);
holder.itemname.setText(addedProductsList.get(position.getName());
holder.itemprice.setText(“Rs”+addedProductsList.get(position.getPrice());
holder.itemdiscount.setText(“Rs”+计算位置”);
holder.itemtotal.setText(“Rs”+计算总数(位置));
holder.button_inc.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int qty=addedProductsList.get(position.getQty();
数量++;
addedProductsList.get(位置).setQty(数量);
持有人项目数量设置文本(“+数量);
holder.itemdiscount.setText(“Rs”+计算位置”);
holder.itemtotal.setText(“Rs”+计算总数(位置));
UpdateTotal();
}
});
holder.button\u dec.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int qty=addedProductsList.get(position.getQty();
数量--;
如果(数量>0){
addedProductsList.get(位置).setQty(数量);
持有人项目数量设置文本(“+数量);
holder.itemdiscount.setText(“Rs”+计算位置”);
holder.itemtotal.setText(“Rs”+计算总数(位置));
UpdateTotal();
}
}
});
holder.button\u cancel.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
addedProductsList.get(位置).setAddedTocart(错误);
//notifyDataSetChanged();
添加产品列表。移除(位置);
已移除(位置)的项目;
UpdateTotal();
}
});
}
@凌驾
public int getItemCount(){
返回addedProductsList.size();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
text查看项目名称、项目总数、项目价格、项目折扣、项目数量;
按钮按钮取消,按钮公司,按钮取消;
约束视图父视图布局;
公共视图持有者(视图项视图){
超级(项目视图);
itemname=itemView.findViewById(R.id.textView\u item\u name);
itemprice=itemView.findViewById(R.id.textView\u item\u price);
item折扣=itemView.findViewById(R.id.textView\u item\u折扣);
itemtotal=itemView.findViewById(R.id.textView\u item\u total);
button\u cancel=itemView.findViewById(R.id.button\u cancel);
button_inc=itemView.findViewById(R.id.button_inc);
button\u dec=itemView.findViewById(R.id.button\u dec);
item_数量=itemView.findViewById(R.id.textView_数量);
父布局=itemView.findViewById(R.id.invoice\u父布局);
}
}
专用浮点计算盘(int pos){
浮点数dis=0;
if(addedProductsList.get(pos.isPrice_g_enabled()){
int qty=addedProductsList.get(pos.getQty();
dis=Float.parseFloat(addedProductsList.get(pos.getPrice())-Float.parseFloat(addedProductsList.get(pos.getPrice_g());
dis=数量*dis;
}
返回dis;
}
私人浮动计算合计(整数位置){
int qty=addedProductsList.get(pos.getQty();
浮动价格,总计;
if(addedProductsList.get(pos.isPrice_g_enabled()){
price=Float.parseFloat(addedProductsList.get(pos.getPrice_g());
}
否则{
price=Float.parseFloat(addedProductsList.get(pos.getPrice());
}
总价=价格*数量;
返回总数;
}
私有void UpdateTotal(){
TextView txtView=((EditQuantity)mContext).findViewById(R.id.TextView_总计);
浮动总额=0,价格=0;
整数数量=0;
for(inti=0;i我建议遍历一个侦听器,移动onclicklistener并删除for循环 所以,一步一步 在适配器类中声明一个接口
public interface OnQuantityChangeListener {
void onQuantityChange( float change );
}
接下来,将专用OnQuantityChangeListener添加到适配器类,并将构造函数更改为在创建时添加一个:
private OnQuantityChangeListener mListener;
public InvoiceRecyclerViewAdapter(Context mContext,List<Products> addedProductsList, OnQuantityChangeListener listener) {
this.mContext=mContext;
this.addedProductsList=addedProductsList;
mListener = listener;
}
public InvoiceRecyclerViewAdapter(Context mContext, OnQuantityChangeListener listener)
{
this.mContext=mContext;
mListener = listener;
}
请记住此时要卸下OnClic
private OnQuantityChangeListener mListener;
public InvoiceRecyclerViewAdapter(Context mContext,List<Products> addedProductsList, OnQuantityChangeListener listener) {
this.mContext=mContext;
this.addedProductsList=addedProductsList;
mListener = listener;
}
public InvoiceRecyclerViewAdapter(Context mContext, OnQuantityChangeListener listener)
{
this.mContext=mContext;
mListener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_invoice,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
viewHolder.button_inc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Products product = addedProductsList.get(getAdapterPosition());
product.setQty( product.getQty() + 1 );
float difference = product.isPrice_g_enabled() ? Float.parseFloat(product.getPrice_g()) : Float.parseFloat(product.getPrice());
mListener.onQuantityChange( difference );
notifyItemChanged( getAdapterPosition ):// This will call onBindViewAdapter again and change all your strings for you
}
});
viewHolder.button_dec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Products product = addedProductsList.get(getAdapterPosition());
if( product.getQty() == 0 )// Can't remove an item if it's already at 0
return;
product.setQty( product.getQty() - 1 );
float difference = product.isPrice_g_enabled() ? Float.parseFloat(product.getPrice_g()) : Float.parseFloat(product.getPrice());
mListener.onQuantityChange( -difference );
notifyItemChanged( getAdapterPosition ):// This will call onBindViewAdapter again and change all your strings for you
}
});
viewHolder.button_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Products product = addedProductsList.get(getAdapterPosition());
float difference = product.isPrice_g_enabled() ? Float.parseFloat(product.getPrice_g()) : Float.parseFloat(product.getPrice());
mListener.onQuantityChange( -difference * product.getQty() );
product.setQty( 0 );
notifyItemChanged( getAdapterPosition ):// This will call onBindViewAdapter again and change all your strings for you
// You decide at this point if you want to remove the item altogether or just show 0
}
});
return viewHolder;
}
private float total = 0;
InvoiceRecyclerViewAdapter adapter = new InvoiceRecyclerViewAdapter(
this ,cart_productslist, new InvoiceRecyclerViewAdapter.OnQuantityChangeListener(){
@Override
void onQuantityChange( float difference ){
total += difference;
total_textview.setText("Rs "+ total);
}
} );