为什么getView()再次调用我的记录?请帮帮我,我是android新手

时间:2014-07-08 06:10:54

标签: android listview textview

   package com.hotel;

   import java.util.ArrayList;
   import android.app.Activity;
   import android.content.res.Resources;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.view.View.OnClickListener;
   import android.view.ViewGroup;
   import android.widget.ArrayAdapter;
   import android.widget.Button;
   import android.widget.ImageView;
   import android.widget.TextView;
   import android.widget.Toast;

   public class CustomOrderedItemAdapter extends ArrayAdapter {
   Activity activity;
   ArrayList orderedList;
   Resources res;

   final int price = 50;
   final int qty = 1;
   static int total;

   public CustomOrderedItemAdapter(Activity activity, ArrayList orderedList,
        Resources res) {
    super(activity, R.layout.ordered_item_cell, orderedList);
    this.activity = activity;
    this.orderedList = orderedList;
    this.res = res;
  }
  public static class ViewHolder {
    TextView textOrderedItem, textItemQty, textOrderedItemPrice;
    ImageView orderedItemImg;
    Button btnUp, btnDown, btnDeleteOrderedItem;
    //int total;
  }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    final int deletePosition = position;
    final ViewHolder holder;
    LayoutInflater inflater = (LayoutInflater) activity
            .getSystemService(activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.ordered_item_cell, null);
        holder = new ViewHolder();

        holder.textOrderedItem = (TextView) convertView
                .findViewById(R.id.textOrderedItem);
        holder.orderedItemImg = (ImageView) convertView
                .findViewById(R.id.orderedItemImg);

        holder.textItemQty = (TextView) convertView
                .findViewById(R.id.textItemQty);
        holder.textItemQty.setText("1");

        holder.btnUp = (Button) convertView.findViewById(R.id.btnUp);
        holder.btnDown = (Button) convertView.findViewById(R.id.btnDown);

        holder.textOrderedItemPrice = (TextView) convertView
                .findViewById(R.id.textOrderedItemPrice);
        holder.textOrderedItemPrice.setText("50");

        holder.btnDeleteOrderedItem = (Button) convertView
                .findViewById(R.id.btnDeleteOrderedItem);


        total=total+(price*qty);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.btnUp.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            int qty = Integer.parseInt(holder.textItemQty.getText()
                    .toString()) + 1;
            holder.textOrderedItemPrice.setText("" + (price * qty));
            holder.textItemQty.setText(String.valueOf(qty));

            total=total+price;
            Toast.makeText(activity,""+total, Toast.LENGTH_LONG).show();

        }
    });

    holder.btnDown.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            int qty = Integer.parseInt(holder.textItemQty.getText()
                    .toString());
            if (qty > 1) {
                qty -= 1;
                holder.textOrderedItemPrice.setText("" + price * qty);
                holder.textItemQty.setText("" + qty);
                total=total-price;
                Toast.makeText(activity,""+total, Toast.LENGTH_LONG).show();
            }
        }
    });
    holder.btnDeleteOrderedItem.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            orderedList.remove(deletePosition);
            notifyDataSetChanged();
        }
    });

    holder.textOrderedItem.setText(orderedList.get(position).toString());
    return convertView;
   }

   }

我想要总计所有物品价格,但我的总数大于我的实际价格 例如:如果我有4个项目,它的价格是50,我总共得到250个而不是200个,并解释我如何自动调用getView()方法,从它调用的地方,谢谢

4 个答案:

答案 0 :(得分:1)

不要将业务逻辑与演示结合起来。

每次绘制视图时都会调用

getView。您无法控制它的调用,也不应该在模型中进行更改或在其中执行计算。

你可以创建一个单独的函数来循环项目并计算总数。

答案 1 :(得分:1)

不应该如何使用getView。只要需要为视图指定位置,ListView就会调用getView。它不会调用每个位置一次。它不承诺按顺序调用任何东西。您不应该在getView中进行任何依赖于任何其他位置的计算 - 您应该做的唯一事情就是为行设置UI。

答案 2 :(得分:0)

一旦调用 CustomOrderedItemAdapter 类,getview()方法将由类自动调用,每当ListView调用getView时,它需要为视图分配位置。所以你不需要调用方法名称getview()

答案 3 :(得分:0)

您正在将convert Total初始化为50。由于数量初始化为1且价格为50.所以总数为50。

现在,当您使用btnUp添加数量时。总数为50.它会被添加。将total初始化为0,它应该可以正常工作。

    total=total+(price*qty); //50

    convertView.setTag(holder);