2015-06-06 6 views
6

Wenn ich die benutzerdefinierte Ansicht jedes Elements der Listenansicht erstellen, bekomme ich eine Nullzeiger Ausnahme und ich weiß nicht, warum die Layout-ID scheintAndroid Studio "Versuch, virtuelle Methode auf eine Null-Objekt Referenz aufzurufen"

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 


public class ActivityMainWish extends Activity { 

private List<Wish> myWishs = new ArrayList<>(); 

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

    creerListe(); 
    creerListeView(); 
    afficherWishView(); 
    ajouterWishListe(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_activity_main_wish, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     //fct 
     return true; 
    } 
    if (id ==R.id.action_add_wish){ 
     startActivity(new Intent(this,ActivityAddWish.class)); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

public void creerListe() { 
    myWishs.add(new Wish("Voiture", 50000, getResources().getDrawable(R.drawable.voiture,null))); 
    myWishs.add(new Wish("TV", 5000, getResources().getDrawable(R.drawable.tv,null))); 
    myWishs.add(new Wish("Smartphone", 500, getResources().getDrawable(R.drawable.smarphone, null))); 
} 

public void creerListeView(){ 
    //convertire les items en views appropier 
    //prend cette liste, le Layout utilise (creer), et la liste d'items a afficher 
    ArrayAdapter<Wish> adapter = new MyListAdapter(); 
    //prend la liste 
    ListView list = (ListView) findViewById(R.id.ListViewWishList); 
    //configure la liste 
    list.setAdapter(adapter); 
} 

private class MyListAdapter extends ArrayAdapter<Wish>{ 
    public MyListAdapter(){ 
     super(ActivityMainWish.this, R.layout.item_view, myWishs); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View itemView = convertView; 
     if (itemView==null) 
      itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false); 

     Wish currentWish = myWishs.get(position); 

     TextView textView = (TextView) itemView.findViewById(R.id.TextViewWishListNom); 
     textView.setText((currentWish.getNom())); 

     TextView prixView = (TextView) itemView.findViewById(R.id.TextViewWishListPrix); 
     prixView.setText(("" + currentWish.getPrix())); 

     ImageView imageView = (ImageView) itemView.findViewById(R.id.ImageViewWishListImage); 
     imageView.setImageDrawable(currentWish.getImage()); 

     return itemView; 
    } 
} 
} 

Haupttätigkeit Layout:

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context=".ActivityMainWish"> 

<ListView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/ListViewWishList" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" /> 

der Artikel Ansicht Layout:

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

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/ImageViewWishListImage" 
    android:src="@drawable/voiture" 
    android:minWidth="80dp" 
    android:minHeight="80dp" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:adjustViewBounds="true" 
    android:maxHeight="80dp" 
    android:maxWidth="80dp" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="Voiture" 
    android:id="@+id/TextViewWishListNom" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentEnd="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:text="50000" 
    android:id="@+id/TextViewWishListPrix" 
    android:layout_alignBottom="@+id/ImageViewWishListImage" 
    android:layout_alignParentEnd="true" /> 

und hier der Fehler

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
     at com.gokhan.mywishlist.ActivityMainWish$MyListAdapter.getView(ActivityMainWish.java:90) 
     at android.widget.AbsListView.obtainView(AbsListView.java:2347) 
     at android.widget.ListView.measureHeightOfChildren(ListView.java:1270) 
     at android.widget.ListView.onMeasure(ListView.java:1182) 
     at android.view.View.measure(View.java:17547) 
     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727) 
     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463) 
     at android.view.View.measure(View.java:17547) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
     at android.view.View.measure(View.java:17547) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535) 
     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:447) 
     at android.view.View.measure(View.java:17547) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615) 
     at android.view.View.measure(View.java:17547) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
     at android.view.Choreographer.doFrame(Choreographer.java:550) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

jede Hilfe und explanition begrüßt

+0

Es sieht aus wie 'itemView' null ist, wenn Sie' nennen itemView.findViewById' –

+0

@DalijaPrasnikar anzeigen itemView = convertView; if (itemView == null) itemView = getLayoutInflater(). Inflate (R.layout.item_view, parent, false); ist hier, um die Null zu behandeln, oder? – Gokh

+0

Es behandelt Null, bevor Sie das Layout aufblasen, aber was ist, wenn das Aufblasen fehlschlägt und null zurückgibt? –

Antwort

4

In Ihr Code

Die getLayoutInFlater() -Methode kann nicht in der inneren Adapterklasse verwendet werden. Daher sollten Sie versuchen, eine Variable zu erstellen, um das Layout-Inflater-Objekt der Elternklasse zu erhalten und damit darauf zuzugreifen, oder Sie können den Kontext der aufrufenden Klasse im Konstruktor der Adapterklasse senden.

Daher können Sie entweder wie folgt verwenden:

public class ActivityMainWish extends Activity { 

LayoutInflate inflater; 
private List<Wish> myWishs = new ArrayList<>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
inflater=getLayoutInflater() 
... 
} 

und verwenden diese inflater Variable hier: itemView = inflater.inflate (R.layout.item_view, Eltern, false);

Oder wie folgt aus:

private class MyListAdapter extends ArrayAdapter<Wish>{ 
private Context mContext; 
public MyListAdapter(Context ctx){ 
    super(ActivityMainWish.this, R.layout.item_view, myWishs); 
    mContext=ctx; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View itemView = convertView; 
    if (itemView==null) 
     itemView = LayoutInflater.from(mContext).inflate(R.layout.item_view, parent, false); 

und das Kontextobjekt senden wie:

ArrayAdapter<Wish> adapter = new MyListAdapter(getApplicationContext()); 
+0

Dank für Ihre Erklärung, es funktioniert, jetzt habe ich den gleichen Fehler auf der Funktion currentWish.getNom() (aus der Klasse Wish), so Ich nehme an, ich muss damit umgehen, wenn ein Wunsch nicht instanziert ist? – Gokh

+1

Es ist wahrscheinlich gut zu bemerken, dass jeder 'View' seinen Kontext kennt. Das funktioniert also auch: 'LayoutInflater.from (parent.getContext())' – dhke

1

Versuchen Sie, den entsprechenden Code in Ihrem Adapter Klasse Wechsel in den folgenden

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View itemView; 
    if (convertView == null) { 
     itemView = inflater.inflate(R.layout.item_view, parent, false); 
    } else { 
     itemView = convertView; 
    } 
    ... 
    ... 
    return itemView; 
} 
Verwandte Themen