2012-07-28 4 views
0

Une erreur est survenue dans une application lorsque j'ai défini un adaptateur sur ListView. En supprimant la ligne de code 60/61 (mainListViewTip/Hour.setAdapter(tip/hourAdapter);), l'application fonctionne parfaitement, sauf que l'adaptateur n'est jamais défini, aucune donnée n'apparaît dans ListView. L'objectif est que les valeurs des champs EditText deviennent de nouvelles valeurs dans la chaîne à afficher dans une ListView avec les entrées précédentes également.Erreur inconnue - Adaptateur de matrice

Le code 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(); 
    } 
} 

Le principal fichier 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> 

Le fichier xml simplerow:

<?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" /> 

Le rapport d'erreur 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

collez le code de votre adaptateur de listview – Khan

+0

C'est dans TipBooKActivity dans le commutateur/cas, près de la fin de l'instruction if. – Adam

Répondre

1

Le problème vient du fait que la présentation que vous transmettez au ArrayAdapter est R.layout.main. Ce n'est pas la ressource que vous voulez passer; vous voulez passer la mise en page pour chaque élément de liste individuel. La mise en page que vous passez doit avoir un TextView avec un certain identifiant, et évidemment R.layout.main ne l'a pas. Essayez de remplacer R.layout.main dans ces deux lignes par android.R.layout.simple_list_item_1 et de supprimer votre ID personnalisé TextView. Cela devrait résoudre l'erreur et permettre à votre liste de s'afficher correctement.

Comme si:

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); 

Si vous souhaitez par la suite utiliser une mise en page personnalisée pour les éléments de liste, essayez this tutorial ou this one.

+0

J'ai fait les changements comme vous l'avez suggéré, mais j'ai reçu un rapport d'erreur identique à celui d'avant. – Adam

+0

J'ai modifié mon post et posté le code que je crois fonctionnera; J'avais oublié de supprimer l'identifiant personnalisé avant. Laissez tomber ... – Eric

+0

Vous êtes la bombe haha. Ça marche.Juste curieux, comment pourrais-je enregistrer les entrées que je viens d'envoyer et en réprimant le bouton, ajouter une autre entrée mais garder l'ancienne? Et, après avoir fermé l'application, comment pourrais-je conserver toutes les entrées, afin qu'elles soient là lors du redémarrage de l'application, même si c'était quelques jours après? – Adam

1

oui eric est changer à droite ces deux lignes de arrayadapter comme indiqué ci-dessous si vous avez fait pas la mise en page pour l'élément de ligne de listview

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); 

par

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

Je pense que adam veut utiliser son propre textview afin qu'il puisse changer la taille du texte et la couleur qui n'est pas possible avec "android.R.layout.simple_list_item_1". Au lieu de cela, nous pouvons utiliser le fichier "simplerow xml" d'adam. pour obtenir ce que nous devons remplacer 2 lignes du code

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); 

Note: le changement est "R.layout.main" à "R.layout.samplerow "