2012-07-28 63 views
0

当我将适配器设置为ListView时,我的应用程序中发生错误。删除60/61行代码(mainListViewTip/Hour.setAdapter(tip/hourAdapter);)后,应用程序可以完美运行,但由于从不设置适配器,因此ListView中不会显示任何数据。目标是使EditText字段的值成为要在ListView中显示的字符串中的新值以及以前的条目。未知错误 - 阵列适配器

的TipBookActivity代码:

public class TipBookActivity extends Activity { 
/** Called when the activity is first created. */ 

TextView textTip,textHour,textWage; 
EditText editHour,editTip; 
float wage; 
int precision = 100; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    textTip = (TextView) findViewById(R.id.tvTip); 
    textHour = (TextView) findViewById(R.id.tvHour); 
    textWage = (TextView) findViewById(R.id.tvWage); 
    editTip = (EditText) findViewById(R.id.etTip); 
    editHour = (EditText) findViewById(R.id.etHour); 
} 

public void myClickHandler (View v){ 
    Button bSubmit = (Button) findViewById(R.id.bSubmit); 
    bSubmit.isClickable(); 
    ListView mainListViewTip = (ListView) findViewById(R.id.mainListViewTip); 
    ListView mainListViewHour = (ListView) findViewById(R.id.mainListViewHour); 
    switch(v.getId()){ 
    case R.id.bSubmit: 
     if(bSubmit.isPressed()){ 
      wage = Float.parseFloat(editTip.getText().toString())/Float.parseFloat(editHour.getText().toString()); 
      String tip = String.format("$%.2f",wage); 
      textWage.setText(String.valueOf(tip) + " an hour");  
      textHour.setText(editHour.getText() + " Hour(s)"); 
      textTip.setText("$" + editTip.getText()); 
      String[] sTip = new String[] {editTip.getText().toString()}; 
      String[] sHour = new String[] {editHour.getText().toString()}; 
      ArrayAdapter<String> tipAdapter = new ArrayAdapter<String>(TipBookActivity.this,R.layout.main,R.id.rowTextView,sTip); 
      ArrayAdapter<String> hourAdapter = new ArrayAdapter<String>(TipBookActivity.this,R.layout.main,R.id.rowTextView,sHour); 
      mainListViewTip.setAdapter(tipAdapter); 
      mainListViewHour.setAdapter(hourAdapter); 
      Toast displayWage = Toast.makeText(this, "$" + editTip.getText() + " over " + editHour.getText() + " hour(s) for a wage of $" + wage + " an hour.", Toast.LENGTH_LONG); 
      displayWage.show(); 
     } 
    } 
} 
public boolean onCreateOptionsMenu(Menu menu){ 
    super.onCreateOptionsMenu(menu); 
    MenuInflater mMain = getMenuInflater(); 
    mMain.inflate(R.menu.main_menu,menu); 
    return true; 
} 

public boolean onOptionsItemSelected(MenuItem item){ 
    ViewFlipper vf = (ViewFlipper) findViewById(R.id.vfMain); 
    switch (item.getItemId()){ 
    case R.id.menuHistory: 
     vf.setAnimation(AnimationUtils.loadAnimation(this, R.anim.slide_in_right)); 
     vf.showNext(); 
     return true; 
    case R.id.menuClear: 
     //set up next tutorials 
     Toast displayClear = Toast.makeText(this, "Clear History feature coming soon.", Toast.LENGTH_SHORT); 
     displayClear.show(); 
     return true; 
    case R.id.menuSettings: 
     Toast displaySettings = Toast.makeText(this, "Settings Options coming soon.", Toast.LENGTH_SHORT); 
     displaySettings.show(); 
     return true; 
    } 
    return false; 
} 

public void onBackPressed() { 
    finish(); 
    } 
} 

主要xml文件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:id="@+id/llMain" > 

<ViewFlipper 
    android:id="@+id/vfMain" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent"> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/rletbtv">  

      <EditText 
       android:id="@+id/etTip" 
       android:layout_height="wrap_content" 
       android:layout_width="140dp" 
       android:hint="Tips" 
       android:layout_margin="8dp" 
       android:inputType="numberDecimal" 
       android:layout_alignParentLeft="true"/> 

      <EditText 
        android:id="@+id/etHour" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:hint="Hours" 
       android:layout_margin="8dp" 
       android:inputType="numberDecimal" 
       android:layout_alignParentRight="true" 
       android:layout_toRightOf="@id/etTip"/> 

      <Button 
       android:id="@+id/bSubmit" 
       android:layout_height="wrap_content" 
       android:layout_width="match_parent" 
       android:layout_margin="8dp" 
       android:ems="10" 
       android:text="Submit" 
       android:textSize="22sp" 
       android:layout_below="@id/etTip" 
       android:onClick="myClickHandler"/> 

      <TextView 
       android:id="@+id/tvTip" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:text="Tips" 
       android:textSize="22sp" 
       android:layout_margin="8dp" 
       android:layout_below="@id/bSubmit"/> 

      <TextView 
       android:id="@+id/tvHour" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:text="Hours" 
       android:textSize="22sp" 
       android:layout_margin="8dp" 
       android:layout_below="@id/bSubmit" 
       android:layout_toRightOf="@id/tvTip"/> 

      <TextView 
       android:id="@+id/tvWage" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:text="Wage" 
       android:textSize="22sp" 
       android:layout_margin="8dp" 
       android:layout_below="@id/bSubmit" 
       android:layout_toRightOf="@id/tvHour"/> 

     </RelativeLayout> 
    </LinearLayout> 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" > 

     <ListView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="50" 
      android:id="@+id/mainListViewTip"/> 

     <ListView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="50" 
      android:id="@+id/mainListViewHour"/> 

</LinearLayout> 
</ViewFlipper> 
</LinearLayout> 

的simplerow xml文件:

<?xml version="1.0" encoding="utf-8"?> 

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/rowTextView" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:padding="10dp" 
android:textSize="16sp" /> 

的logcat的错误报告:

FATAL EXCEPTION: main 
java.lang.NullPointerException 
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:353) 
at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323) 
at android.widget.AbsListView.obtainView(AbsListView.java:1315) 
at android.widget.ListView.measureHeightOfChildren(ListView.java:1198) 
at android.widget.ListView.onMeasure(ListView.java:1109) 
at android.view.View.measure(View.java:8171) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:381) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
at android.view.View.measure(View.java:8171) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
at android.view.View.measure(View.java:8171) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:381) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
at android.view.View.measure(View.java:8171) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
at android.view.View.measure(View.java:8171) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:526) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
at android.view.View.measure(View.java:8171) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
at android.view.View.measure(View.java:8171) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:801) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4627) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 
+0

你的适配器的列表视图的粘贴代码 – Khan 2012-07-28 04:35:20

+0

它在开关/ case中的TipBooKActivity中,靠近if语句的末尾。 – Adam 2012-07-28 04:37:08

回答

1

问题是因为您传递给ArrayAdapter的布局是R.layout.main。这不是你想要传递的资源;你想传递每个单独列表项目的布局。你传递的布局必须有一个TextView和一个特定的ID,显然R.layout.main没有这个。

尝试用这两行中的R.layout.main代替android.R.layout.simple_list_item_1,并删除您的自定义TextView ID。这应该解决错误并允许您的列表正确显示。

像这样:

ArrayAdapter<String> tipAdapter = new ArrayAdapter<String>(TipBookActivity.this,android.R.layout.simple_list_item_1,sTip); 
ArrayAdapter<String> hourAdapter = new ArrayAdapter<String>(TipBookActivity.this,android.R.layout.simple_list_item_1,sHour); 

如果你以后想使用列表项的自定义布局,尽量this tutorialthis one

+0

我按照您的建议进行了更改,但得到了和以前一样的错误报告。 – Adam 2012-07-28 04:45:32

+0

我修改了我的帖子并发布了我认为可以工作的代码;我之前忘记了删除自定义ID。给那个去... – Eric 2012-07-28 04:47:59

+0

你是炸弹哈哈。有用。只是好奇,我将如何保存我刚刚发送的条目,并在压制按钮时,添加另一个条目,但保留旧条目?并且,在关闭应用程序之后,我将如何保留所有条目,以便在重新启动应用程序时它们会在那里,即使是在几天之后? – Adam 2012-07-28 04:52:37

1

是埃里克是正确的改变arrayadapter的这两条线,如下图所示,如果你还没有做布局列表视图的列项由

ArrayAdapter<String> tipAdapter = new ArrayAdapter<String>(TipBookActivity.this,android.R.layout.simple_list_item_1,sTip); 
ArrayAdapter<String> hourAdapter = new ArrayAdapter<String>(TipBookActivity.this,android.R.layout.simple_list_item_1,sHour); 
1

我认为亚当想用他的

ArrayAdapter<String> tipAdapter = new ArrayAdapter<String>(TipBookActivity.this,R.layout.main,R.id.rowTextView,sTip); 
ArrayAdapter<String> hourAdapter = new ArrayAdapter<String>(TipBookActivity.this,R.layout.main,R.id.rowTextView,sHour); 

自己的textview,以便他可以更改文本的大小和颜色,这是“android.R.layout.simple_list_item_1”不可能实现的。相反,我们可以使用adam的“simplerow xml”文件。得到这一点,我们需要更换2行代码

ArrayAdapter<String> tipAdapter = new ArrayAdapter<String>(TipBookActivity.this,R.layout.main,R.id.rowTextView,sTip); 
ArrayAdapter<String> hourAdapter = new ArrayAdapter<String>(TipBookActivity.this,R.layout.main,R.id.rowTextView,sHour); 

ArrayAdapter<String> tipAdapter = new ArrayAdapter<String>(TipBookActivity.this,R.layout.samplerow,R.id.rowTextView,sTip); 
ArrayAdapter<String> hourAdapter = new ArrayAdapter<String>(TipBookActivity.this,R.layout.samplerow,R.id.rowTextView,sHour); 

注:变化是 “R.layout.main” 到“R.layout.samplerow