使用另一个类更改一个类的文本视图

时间:2013-09-13 03:01:43

标签: android class listview dynamic textview

我正在构建一个动态设置listview的计算器。在构建时(使用计算),将为每个项目设置onclickListener以删除该行。这一切都是通过AdapterClass完成的。我有我的MainClass,它包含所有信息。在这个课程中,它有我的项目的总计。此运行总计有一个类,可以添加/减去/检索我的运行总计。运行总计(截至目前)仅在" CALCULATE"按下按钮。当我删除一个项目(行/计算)时,我需要它来更新我的主类中的运行总计。请注意,用于删除项目的onClick位于我的AdapterClass,而不是我的MainClass。如果您需要进一步解释,请告诉我。

更好的解释

enter image description here

MainActivity

//This is called in my CALCULATE on click, after all the calulations have been made. THE ONLY PLACE THAT THE RUNNING TOTAL GETS CHANGED
newList=new ArrayList<Calculations>();

Calculations info = new Calculations();

info.SetType("Slab figure "+figureCount);
info.SetFigure(width+"x"+length+"x"+depth);
info.SetFigureAmount(String.format("%.2f",CubicYd)+"");
newList.add(info);
currentTotal.add(CubicYd);

total.setText(String.format("Total: "+"%.2f",currentTotal.getRunningTotal())+" Cubic Yards");

if(newList!=null&&newList.size()>0)

{
    newAdapter.notifyDataSetChanged();
    newAdapter.add(newList.get(0));
    i++;
}

newAdapter.notifyDataSetChanged();

runningTotal

public class runningTotal {

    double runningTotal = 0.0;

    public double add(double newAmount) {
        runningTotal = runningTotal + newAmount;
        return runningTotal;
    }

    public double sub(double newAmount) {
        runningTotal = runningTotal - newAmount;
        return runningTotal;
    }

    public double getRunningTotal() {
        return runningTotal;
    }

    public void setRunningTotal() {
        runningTotal = 0.0;
    }
}

ListAdapter

public class CustomListAdapter extends ArrayAdapter<Calculations> {

    runningTotal currentTotal = new runningTotal();
    Calculations c = new Calculations();
    private Context appContext = null;
    private ArrayList<Calculations> items = null;

    public CustomListAdapter(Context context, int textViewResourceId,
            ArrayList<Calculations> items) {
        super(context, textViewResourceId, items);
        this.appContext = context;
        this.items = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) appContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.list_item, null);
        }
        c = items.get(position);
        if (c != null) {
            //Set the calculations to the list view
            TextView type = (TextView) v.findViewById(R.id.tvType);
            TextView figure = (TextView) v.findViewById(R.id.tvFullFigure);
            TextView amount = (TextView) v.findViewById(R.id.tvAmount);
            RelativeLayout layout = (RelativeLayout) v.findViewById(R.id.list_item_id);
            layout.setTag(position);

            //set on click to the layout that deletes the line.
            layout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String pos = view.getTag().toString();
                    int _position = Integer.parseInt(pos);
                    currentTotal.sub(Double.parseDouble(c.getFigureAmount()));
     <----This is where I need to update the textView "total" in my mainAcitivity----->
                    items.remove(_position);
                    notifyDataSetChanged();
                    Toast.makeText(appContext, "The amount to be released is " + Double
                            .parseDouble(c.getFigureAmount()), Toast.LENGTH_LONG).show();

                }
            });
            if (type != null) {
                type.setText(c.getType());
            }
            if (figure != null) {
                figure.setText(c.getFigure());
            }
            if (amount != null) {
                amount.setText(c.getFigureAmount());
            }
        }
        return v;
    }
}

计算

private String type = "";
private String figure = "";
private String figureTotal = "";

public void SetType(String type){
    this.type = type;
}
public String getType(){
    return this.type;
}

public void SetFigure(String figure) {
    this.figure = figure;
}
public String getFigure(){
    return this.figure;
}

public void SetFigureAmount(String figureTotal){
    this.figureTotal = figureTotal;
}

public String getFigureAmount(){
    return this.figureTotal;
}

更新/我的CustomListAdapter来自初学者的ViewHolder

 @Override
public View getView(int position, View convertView,           ViewGroup parent) {
    View v = convertView;

     if(v == null) {
        LayoutInflater vi = (LayoutInflater)appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        holder = new ViewHolder();
        holder.text = (TextView) v.findViewById(R.id.tvTotal);
        v = vi.inflate(R.layout.list_item, null);
        convertView.setTag(holder);
    } else {
       holder = (ViewHolder) convertView.getTag();
    }

    holder.text.setText(currentTotal.getRunningTotal()+"");

    c = items.get(position);
    if (c != null){
        //Set the calculations to the list view
        TextView type = (TextView) v.findViewById(R.id.tvType);

        TextView figure = (TextView) v.findViewById(R.id.tvFullFigure);
        TextView amount = (TextView) v.findViewById(R.id.tvAmount);
        RelativeLayout layout = (RelativeLayout) v.findViewById(R.id.list_item_id);
        layout.setTag(position);



        //set on click to the layout that deletes the line.

        layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String pos = view.getTag().toString();
                int _position = Integer.parseInt(pos);
                double newTotal;
                double oldTotal;
                oldTotal = Double.parseDouble(c.getFigureAmount());
                newTotal = currentTotal.getRunningTotal() - oldTotal;
                currentTotal.setRunningTotal(newTotal);


                holder.text.setText("total after delete" );

                items.remove(_position);
                notifyDataSetChanged();

            }
        });
        if(type!=null) {
            type.setText(c.getType());
        }
        if(figure!=null){
            figure.setText(c.getFigure());
        }
        if(amount !=null){

            amount.setText(c.getFigureAmount());
        }

    }
    return v;
}

static class ViewHolder{

    TextView text;
}
}

我在行

中得到nullPointer
  

holder.text =(TextView)v.findViewById(R.id.tvTotal);

2 个答案:

答案 0 :(得分:1)

问题是,如果你调用list.setOnItemClickListener并在活动中连接你的onclick,而不是你的适配器上的layout.setOnClickListener,那么你正在使用单击列表中的视图。注意我并不是说你不能做你要做的事情,但这是修复它的推荐方法。

类似的东西(在文本视图所在的主Activity上):

listView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Calculations c = (Calculations) parent.getAdapter().getItem(position);
        currentTotal.sub(Double.parseDouble(c.getFigureAmount()));
        total.setText(String.format("Total: "+"%.2f",currentTotal.getRunningTotal())+" Cubic Yards");
        items.remove(_position);
        notifyDataSetChanged();
        Toast.makeText(appContext, "The amount to be released is " + Double
                .parseDouble(c.getFigureAmount()), Toast.LENGTH_LONG).show();

    }
});

虽然您从未发布过设置适配器的位置,因此我不确定您的列表视图是什么。

答案 1 :(得分:0)

在适配器类中使用持有者并尝试使用持有者更新视图..这是一个例子

 @Override
public View getView(int position, View convertView, ViewGroup parent) {

    // A ViewHolder keeps references to children views to avoid unneccessary
    // calls
    // to findViewById() on each row.
    ViewHolder holder;
    // When convertView is not null, we can reuse it directly, there is no
    // need
    // to reinflate it. We only inflate a new View when the convertView
    // supplied
    // by ListView is null.

    if (convertView == null) {

        convertView = mInflater.inflate(R.layout.sample, null);
        // Creates a ViewHolder and store references to the two children
        // views
        // we want to bind data to.
        holder = new ViewHolder();
        holder.name = (TextView) convertView.findViewById(R.id.text);
        holder.icon = (ImageView) convertView.findViewById(R.id.icon);
        convertView.setTag(holder);
    } else {
        // Get the ViewHolder back to get fast access to the TextView
        // and the ImageView.

        holder = (ViewHolder) convertView.getTag();

    }

    // Bind the data efficiently with the holder.
    holder.name.setText(myElements.get(id));
    holder.icon.setImageBitmap(mIcon1);

    return convertView;
}

static class ViewHolder {
    TextView  name;
    ImageView icon;
}

现在,假设您要更新名为textview

total

第1步 在ViewHolder类中定义总计,如

static class ViewHolder {   / *定义所有视图以在此处更新* /    TextView总计;

}

第2步

在getView()方法中创建ViewHolder的实例。  ViewHolder holder;

第3步  使用持有人在onclick方法中更新您的textview

holder.total.setText(“你要设置的文字”);