Как рассчитать общую стоимость корзины покупок? - PullRequest
0 голосов
/ 28 мая 2020

Раздел корзины моего приложения реализуется офлайн, когда пользователь нажимает кнопку добавления. Товар сохраняется в базе данных, а затем отображается в корзине.

мой вопрос

Как я могу изменить цену на товары после изменения количества товаров? (Общая цена числа рассчитывается для каждого продукта, но после изменения числа общая цена не меняется.)

cartadapter. java

public class FacultyAdapter extends RecyclerView.Adapter<FacultyAdapter.FacultyViewHolder> {

dbhandler mydb;
private int counter=1;
private Context context;
private List<Faculty> facultyList;
Faculty faculty ;

public FacultyAdapter(Context context, List<Faculty> facultyList) {
    this.context = context;
    this.facultyList=facultyList;
}

@NonNull
@Override
public FacultyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(context).inflate(R.layout.itemcard,parent,false);
    RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
   ViewGroup.LayoutParams.WRAP_CONTENT);
    view.setLayoutParams(lp);

    return new FacultyViewHolder(view);
}


   /////////////////////////////////////////////////
 @Override
 public void onBindViewHolder(@NonNull final FacultyViewHolder holder,final int position) {

     faculty = facultyList.get(position);
    holder.title.setText(faculty.getName());
   holder.price.setText(faculty.getPrice());
   holder.count.setText(String.valueOf(faculty.getQty()));
   holder.inc.setGravity(Gravity.CENTER);
    String photoname=faculty.getImage();
    Glide
            .with(context)
            .load( Urls.image+photoname)
            .placeholder(R.mipmap.ic_launcher_round)
            .error(R.drawable.logo)
           .into(holder.img);

    mydb=new dbhandler(context);


         //////////////////////////////////
    holder.inc.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           int count= Integer.parseInt(String.valueOf(holder.count.getText()));
           count++;
           holder.count.setText(String.valueOf(count));
            faculty.setQty(count);
        Log.d("inc",""+faculty.getQty());
       }
   });
    holder.dec.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int count= Integer.parseInt(String.valueOf(holder.count.getText()));
            if(count>1){
                count--;
                holder.count.setText(String.valueOf(count));
                faculty.setQty(count);
              //  Log.d("dec",""+count);
            }
        }
    });
}
 ///////////////////////////////////
@Override
public int getItemCount() {
    return facultyList.size();
}
 ////////////////////////////////
public class FacultyViewHolder extends RecyclerView.ViewHolder {

    TextView title;
    TextView price,count;
   ImageView img;
    CardView card,viewBackground;

 Button inc,dec;
    private FacultyViewHolder(View itemView) {
        super(itemView);
        title = itemView.findViewById(R.id.txt_list_item_title);
        price = itemView.findViewById(R.id.txt_list_item_des);  
       img=itemView.findViewById(R.id.image_cart);
        inc=itemView.findViewById(R.id.increment);
        dec=itemView.findViewById(R.id.decrement);
        count=itemView.findViewById(R.id.display);
        card =itemView.findViewById(R.id.card);
        viewBackground =itemView.findViewById(R.id.view_background);
    }
}

//////////////////////////////////////////
public void remove(int position){
    final Faculty s = facultyList.get(position);
    facultyList.remove(position);
    String e=s.getId().toString();
    mydb.delete(e);
    notifyItemRemoved(position);
}

}

активность корзины. java

 public class cart extends AppCompatActivity implements 
  RecyclerItemTouchHelper.RecyclerItemTouchHelperListener {
Button Add,total; 
ImageButton back_btn;
Faculty items;
private TextView price_total; 
FacultyAdapter facultyAdapter;
dbhandler mydb;
String name;
 List<Faculty> posts;
String id, title, status, price, image,sum;
@SuppressLint("WrongConstant")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cart);

    RecyclerView recyclerView = findViewById(R.id.rv_card);
    Add = findViewById(R.id.btn_basket_pay);
    price_total = findViewById(R.id.totalPrice);
    mydb=new dbhandler(getApplicationContext());
    back_btn=findViewById(R.id.back);
    total=findViewById(R.id.total);

   mydb.open();

    facultyAdapter = new FacultyAdapter(getApplicationContext(), mydb.display());
    recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), 
   LinearLayoutManager.VERTICAL, false));
    recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(facultyAdapter);  

   facultyAdapter.registerAdapterDataObserver(observer);
    posts= mydb.display();

    for (int i= 0; i < posts.size(); i++){
       facultyAdapter.calculateTotalF(i);      
        name=""+posts.get(i).getName();
    }

    items = new Faculty(id,title, status, price, sum);
    SharedPreferences preferences = getSharedPreferences("prefs",MODE_PRIVATE);
    facultyAdapter.notifyDataSetChanged();
    items.setSum(String.valueOf(price_total.getText()));

    //////////////////////////////////
    mydb.close();

    total.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          //  price_total.setText(""+ bundle.getString(qty_dkey));
        }
    });
       ////////////////////////////////////////////////
    back_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(cart.this, MainActivity.class));
            finish();
        }
    });
      //////////////////////////
    ItemTouchHelper.SimpleCallback simpleCallback=new RecyclerItemTouchHelper(0,ItemTouchHelper.LEFT 
   |ItemTouchHelper.RIGHT,this);
    new ItemTouchHelper(simpleCallback).attachToRecyclerView(recyclerView);
    //////////////////////////////////////////////////
    Add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           add();
        }
    });
  }
  //////////////////////////////////////////////////////////////////////////
 public int calculateMealTotal(){
 int mealTotal = 0;
for(Faculty order : posts){
    mealTotal +=Integer.parseInt(order.getPrice()) * order.getQty();
    Log.d("qtyad",""+order.getQty());
    Log.d(" mealTotal",""+ mealTotal);
}

return mealTotal;
}

RecyclerView.AdapterDataObserver observer = new RecyclerView.AdapterDataObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        setMealTotal();
        Log.d("ob","ob");

    }
};
public void setMealTotal(){
    price_total.setText(" "+ calculateMealTotal());
}

отображение в базе данных

    public List<Faculty> display(){

    SQLiteDatabase db = this.getReadableDatabase();
    String selectQuery = "SELECT  * FROM " + TBL_NAME ;
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor!= null)
        cursor.moveToFirst();
    List<Faculty> facultyList = new ArrayList<>();
    try {
        do{

            Faculty faculty = new Faculty(id,title, status, price, image);
            faculty.setId(cursor.getString(0));
            faculty.setName(cursor.getString(1));
            faculty.setPrice(cursor.getString(3));
            faculty.setQty(cursor.getInt(4));
            faculty.setImage(cursor.getString(2));
            // faculty.setQty(cursor.getString(3));
            facultyList.add(faculty);
        }while (cursor.moveToNext());

    } catch (Exception e) {
        e.printStackTrace();
    }

    return facultyList;
}

1 Ответ

0 голосов
/ 28 мая 2020

Ваша проблема связана с ссылкой на объект.

Вы передаете один объект в Адаптер и используете другой в Activity.

facultyAdapter = new FacultyAdapter(getApplicationContext(), mydb.display()); //one object

и сохраняете в сообщении с использованием той же функции db

 posts= mydb.display(); //creates another object

Что вы можете сделать, так это сдвинуть posts= mydb.display(); выше назначения адаптера.

Итак, ваш код выглядит как

posts= mydb.display();
facultyAdapter = new FacultyAdapter(getApplicationContext(), posts);

Теперь при нажатии кнопки «Добавить» наClickListener используйте setMealTotal() после add().

Add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           add();
           setMealTotal()
        }
});

РЕДАКТИРОВАТЬ

Для обновления вашей общей цены вам необходимо изменить значения вашего количества в FacultyList, а также в БД, в которой вы находитесь сохранение данных корзины. В настоящее время вы обновляете пользовательский интерфейс вручную на адаптере BindViewHolder, что не рекомендуется, поскольку это задача адаптера по обновлению пользовательского интерфейса в соответствии с данными, с которыми он связан. Отметьте Android Room или CursorAdpter с Recyclerview, чтобы легко выполнить эту задачу.

В настоящее время вы можете создать интерфейс для уведомления вашей активности об изменениях в вашей корзине.

interface ICartModification{
  void increment(int qty, Faculty faculty)
  void decrement(int qty, Faculty faculty)
} 

Реализуйте этот интерфейс в CartActivity

@Overrides
void increment(int qty, Faculty faculty){
   faculty.setQty(qty)

    //update DB here
   facultyAdapter.notifyDataSetChanged()
   setMealTotal()
}
@Overrides
void decrement(int qty, Faculty faculty){
   if(qty<=0)
      posts.remove(faculty)
   else
      faculty.setQty(qty)

   //update DB here
   facultyAdapter.notifyDataSetChanged()
   setMealTotal()
}

и передать ссылку на Activity адаптеру.

facultyAdapter = new FacultyAdapter(this, mydb.display());

Теперь на вашем In c и Dcr вызовите эту функцию обновления следующим образом:

holder.inc.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {

           if(context instanceof ICartModification){
               ((ICartModification)context).increment(faculty.getQty()+1, faculty);
           }
       }
   });

holder.dec.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {

               if(context instanceof ICartModification){
                   ((ICartModification)context).decrement(faculty.getQty()-1, faculty);
               }
           }
       });
...