【问题标题】:Calculate average from EditTexts从 EditTexts 计算平均值
【发布时间】:2014-08-21 14:58:52
【问题描述】:

在我的活动中,有两个按钮:一个用于将项目添加到 ListView,它由 EditText(用户在其中输入十进制数字)形成,另一个用于开始计算。目标是计算 EditTexts 中输入的数字的平均值,具体取决于添加到 ListView 的项目数。

这里是Activity的代码:

public class PersActivity extends Activity {

Button start, calcaverage1;
ListView MarkListView;
TextView markresult;
private SubjectAdapter adapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.subject_list_view);

    setupListViewAdapter();

    setupAddMarkButton();

    // Start button
            start = (Button)findViewById(R.id.start1);
            start.setOnClickListener(new OnClickListener() 
            {   public void onClick(View v) 
                {   
                    Intent intent = new Intent(PersActivity.this, MainActivity.class);
                        startActivity(intent);      
                        finish();
                }
            });

    // Calc average button
            calcaverage1 = (Button) findViewById(R.id.calcaverage);
            calcaverage1.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    addNumberFromText();                        
                }
            });
}

public void removeClick(View v) {
    Mark itemToRemove = (Mark)v.getTag();
    adapter.remove(itemToRemove);
}

private void setupListViewAdapter() {
    adapter = new SubjectAdapter(PersActivity.this, R.layout.subject_list_item, new ArrayList<Mark>());
    MarkListView = (ListView)findViewById(R.id.subject_list_item);
    MarkListView.setAdapter(adapter);
}

private void setupAddMarkButton() {
    findViewById(R.id.addsubject).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            adapter.insert(new Mark("", 0), 0);
        }
    });
}
void addNumberFromText()
{
    double total=0;
    for(int i=0;i<MarkListView.getChildCount();i++)
    {
        View wantedView = MarkListView.getChildAt(i);
        markresult = (TextView)wantedView.findViewById(R.id.subjectmark);
        double value=Double.parseDouble(markresult.toString());
        total+=value;
    }
    Log.d("PersActivity","total sum is "+total);
}

}

这是我使用的适配器的代码:

public class SubjectAdapter extends ArrayAdapter<Mark> {

protected static final String LOG_TAG = SubjectAdapter.class.getSimpleName();

private List<Mark> items;
private int layoutResourceId;
private Context context;

public SubjectAdapter(Context context, int layoutResourceId, List<Mark> items) {
    super(context, layoutResourceId, items);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.items = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    MarkHolder holder = null;

    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    row = inflater.inflate(layoutResourceId, parent, false);

    holder = new MarkHolder();
    holder.Mark = items.get(position);
    holder.removeButton = (ImageButton)row.findViewById(R.id.remove);
    holder.removeButton.setTag(holder.Mark);

    holder.name = (TextView)row.findViewById(R.id.subjectname);
    setNameTextChangeListener(holder);
    holder.value = (TextView)row.findViewById(R.id.subjectmark);
    setValueTextListeners(holder);

    row.setTag(holder);

    setupItem(holder);
    return row;
}

private void setupItem(MarkHolder holder) {
    holder.name.setText(holder.Mark.getName());
    holder.value.setText(String.valueOf(holder.Mark.getValue()));
}

public static class MarkHolder {
    Mark Mark;
    TextView name;
    TextView value;
    ImageButton removeButton;
}

private void setNameTextChangeListener(final MarkHolder holder) {
    holder.name.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            holder.Mark.setName(s.toString());
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        @Override
        public void afterTextChanged(Editable s) { }
    });
}

private void setValueTextListeners(final MarkHolder holder) {
    holder.value.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            try{
                holder.Mark.setValue(Double.parseDouble(s.toString()));
            }catch (NumberFormatException e) {
                Log.e(LOG_TAG, "error reading double value: " + s.toString());
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        @Override
        public void afterTextChanged(Editable s) { }
    });
}
}

按下按钮后会通过TextView显示结果。

这是活动的截图。实际上它没有错误,但是当我尝试启动活动时应用程序停止了。

EDIT3:按下 calculateaverage 按钮时出现 LogCat 错误

08-21 15:59:34.170: E/AndroidRuntime(1678): FATAL EXCEPTION: main
08-21 15:59:34.170: E/AndroidRuntime(1678): java.lang.NumberFormatException: Invalid double: "android.widget.EditText@536f3e10"
08-21 15:59:34.170: E/AndroidRuntime(1678):     at java.lang.StringToReal.invalidReal(StringToReal.java:63)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at java.lang.StringToReal.initialParse(StringToReal.java:114)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at java.lang.StringToReal.parseDouble(StringToReal.java:263)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at java.lang.Double.parseDouble(Double.java:295)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at com.isa.gestordecurso.PersActivity.addNumberFromText(PersActivity.java:81)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at com.isa.gestordecurso.PersActivity$2.onClick(PersActivity.java:49)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at android.view.View.performClick(View.java:4084)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at android.view.View$PerformClick.run(View.java:16966)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at android.os.Handler.handleCallback(Handler.java:615)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at android.os.Looper.loop(Looper.java:137)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at android.app.ActivityThread.main(ActivityThread.java:4745)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at java.lang.reflect.Method.invokeNative(Native Method)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at java.lang.reflect.Method.invoke(Method.java:511)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-21 15:59:34.170: E/AndroidRuntime(1678):     at dalvik.system.NativeStart.main(Native Method)

希望有解决方案!非常感谢!

【问题讨论】:

  • 如果您的活动在启动时停止,则必须有堆栈跟踪。在 Eclipse 中,检查 LogCat 视图并在此处发布堆栈跟踪。

标签: android android-listview android-edittext textview


【解决方案1】:

从您的代码 sn-p 看来,您似乎忘记初始化 calcaverage1 按钮。这就是为什么当您尝试调用 setOnClickListener 时会收到 NullPointerException 的原因。只需声明并初始化calcaverage1 按钮。

Button calcaverage1= (Button)findViewById(R.id.calc);
calcaverage1.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
         addNumberFromText();                        
    }
});

编辑:

对于第二个NullPointerException: 你已经创建了一个成员变量ListView MarkListView;。但是,你没有初始化它。相反,您创建了一个同名的局部变量 ListView MarkListView = (ListView)findViewById(R.id.subject_list_item); 在 setupListViewAdapter 方法中。 这是一个完全不同的变量。

将此行替换为:

ListView MarkListView = (ListView)findViewById(R.id.subject_list_item);

用这一行:

MarkListView = (ListView)findViewById(R.id.subject_list_item);

【讨论】:

  • 为什么不能?我的意思是,有什么问题?只需阅读输入并使用计算平均值的公式。你能具体解释一下你的问题是什么吗?
  • 是的,对不起。我的问题是,当我按下“calculateaverage”按钮时,我的应用程序停止了。我现在编辑并添加 LogCat
  • 你已经创建了一个成员变量ListView MarkListView;。但是,你没有初始化它。相反,您在setupListViewAdapter 方法中创建了一个同名的变量ListView MarkListView = (ListView)findViewById(R.id.subject_list_item);。这是一个完全不同的变量。将此行编辑为:MarkListView = (ListView)findViewById(R.id.subject_list_item);
  • 你是对的,但现在我在按下按钮时再次出错。我更新 LogCat 错误
  • 在addNumberFromText() 方法中使用这一行double value=Double.parseDouble(markresult.getText());。您将不正确的参数传递给 parseDouble() 方法
【解决方案2】:

根据 logCat 堆栈跟踪,您会遇到数字格式异常。换行:

double value=Double.parseDouble(markresult.toString());

收件人:

double value=Double.parseDouble(markresult.getText());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多