2012-07-28 64 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