2017-05-22 1 views
1

Ich möchte eine Listenansicht, die ein Bild und einen Text zeigt, so folgte ich einem Online-Tutorial. Leider stürzt meine App ständig ab, wenn ich den Adapter der Listenansicht auf den customAdapter setze. Ich konnte das Problem nicht lösen. Logcat:ListView mit benutzerdefinierten Adapter, der Bilder und Texte zeigt

--------- beginning of crash 
05-22 14:53:29.436 2592-2592/com.example.mohammadel_ghali.attendance E/AndroidRuntime: FATAL EXCEPTION: main 
                         Process: com.example.mohammadel_ghali.attendance, PID: 2592 
                         android.view.InflateException: Binary XML file line #25: addView(View, LayoutParams) is not supported in AdapterView 


    Caused by: java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView 
at com.example.mohammadel_ghali.attendance.customAdapter.getView(customAdapter.java:48) 

Meine customAdapter Klasse

public class customAdapter extends ArrayAdapter<Students>{ 

    public Context context; 
    public int layoutResoruceId; 
    public List<Students> data = null; 


    public customAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<Students> objects) {//constructor 
     super(context, resource, objects); 
     this.context=context; 
     this.layoutResoruceId=resource; 
     this.data=objects; 
    } 

    public static class DataHolder{//class for holding the data 
     ImageView ivPersonHolder; 
     TextView tvNameHolder; 
    } 


    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {//returns the "View" 
     DataHolder holder = null; 
     if(convertView==null){ 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      convertView = inflater.inflate(layoutResoruceId, parent); 
      holder = new DataHolder(); 
      holder.ivPersonHolder = (ImageView)convertView.findViewById(R.id.ivPerson); 
      holder.tvNameHolder = (TextView)convertView.findViewById(R.id.tvName); 

      convertView.setTag(holder); 
     }else{ 
      holder = (DataHolder)convertView.getTag(); 
     } 
     Students student = data.get(position); 
     holder.tvNameHolder.setText(student.toString()); 
     holder.ivPersonHolder.setImageResource(student.getImageId()); 

     return convertView; 
    } 
} 

Mein itemrow xml Layout

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
android:orientation="horizontal" 
android:weightSum="1"> 

<ImageView 
    android:id="@+id/ivPerson" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:srcCompat="@mipmap/ic_launcher" 
    android:layout_gravity="center" 
    android:layout_margin="@dimen/itemmargin"/> 



    <TextView 
     android:id="@+id/tvName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="TextView" 
     android:layout_gravity="center" 
     android:layout_margin="@dimen/itemmargin" 
     android:layout_weight="0.33" /> 
</LinearLayout> 

Einstellung der Adapter

ListView lv = (ListView) findViewById(R.id.lvStudentsList); 
customAdapter adapter = new customAdapter(this, R.layout.itemrow, students); 
lv.setAdapter(adapter); 
+0

die stacktrace über ein anderes Problem ist, legen Sie die richtige Ausnahme hier –

+0

ich meine Post bearbeitet, die Ausnahme besagt. –

Antwort

0

Sie sollten dieaußer Kraft zu setzenMethode in Ihrer customAdapter um Android wissen, wie viele itens es in ListView angezeigt haben:

@Override 
    public int getCount() { 
     return data.size(); 
    } 

Auch diese Zeile ändern, weil Ihr Adapter nicht erlaubt, neue Ansicht hinzufügen:

convertView = inflator.inflate(layoutResoruceId, parent); 

zu

convertView = inflator.inflate(layoutResoruceId, null); 
+0

Ich habe es hinzugefügt, aber immer noch den gleichen Fehler. Ich habe die Ausnahme in der Post aktualisiert. –

+0

Überprüfen Sie meine bearbeitete Antwort –

0

Offenbar lag das Problem in dieser Zeile (in customAdapter.java):

convertView = inflater.inflate(layoutResoruceId, parent); 

es sein sollte:

convertView = inflater.inflate(layoutResoruceId, null); 

Ich weiß wirklich nicht, warum, aber ich würde es begrüßen, wenn jemand irgendeine Art von Erklärung geben könnte. Vielen Dank.

+0

Danke an https://Stackoverflow.com/users/6887777/luiz-fernando-salvaterra, um mir zu helfen –

+0

Schnelle Erklärung: In diesem 'inflate()' Aufruf ist das zweite Argument das Elternteil der aufgeblasen 'View'. Wenn Sie diesen Elternteil angeben, fügt der 'LayoutInflater' automatisch die aufgeblähte' Ansicht' zum Elternteil mit seiner 'addView() 'hinzu. Das Elternelement ist in diesem Fall die 'ListView', die das Hinzufügen von' View's nicht erlaubt, also die Ausnahme. Die Übergabe von 'null' verhindert stattdessen, dass der Inflatter automatisch die 'Ansicht' zu etwas hinzufügt. Du solltest eigentlich 'inflator.inflate (layoutResoruceId, parent, false)' 'verwenden, damit die aufgeblähte' View' die Eigenschaften des Elternteils respektiert, aber immer noch nicht hinzugefügt wird –

+0

Anyhoo, es ist nicht wirklich nötig, deine eigene Antwort hinzuzufügen dieser Fall.Akzeptieren Sie einfach die Antwort wie Sie und hinterlassen Sie einen Kommentar, um das tatsächliche, spezifische Problem anzuzeigen. Prost! –

1

Ihr Adapter kann keine neue Ansicht hinzufügen.

Verwenden Sie einfach:

convertView = inflater.inflate(layoutResoruceId, null); 

Statt:

convertView = inflater.inflate(layoutResoruceId, parent); 
Verwandte Themen