Search code examples
androidandroid-studioandroid-layoutandroid-listview

Custom ArrayAdapter for a ListView (Android)


I'm trying to show a Listview with Custom ArrayAdapter and i don't know what is my error. The console show this error:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.registro/com.example.registro.MainActivity}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'.

Can someone help me. Thank you

MainActivity.java

public class MainActivity extends ListActivity {
private ListView List_View;

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

    List_View = (ListView) findViewById(R.id.list);
}

public void VerTabla (View view) {

    AdminBD admin = new AdminBD(this, "BaseDatos", null, 1);
    SQLiteDatabase BaseDatos = admin.getWritableDatabase();
    ArrayList<DataUsuario> contenidoTabla = new ArrayList<DataUsuario>();

    try {
        Cursor fila = BaseDatos.rawQuery("select dni, nombre, telefono from usuario", null);

        for(fila.moveToFirst(); !fila.isAfterLast(); fila.moveToNext()) {
            DataUsuario user = new DataUsuario(
                    fila.getString(0),
                    fila.getString(1),
                    fila.getInt(2)
            );
            contenidoTabla.add(user);
        }

        UsuarioAdapter myAdp = new UsuarioAdapter(this, R.layout.persona_fila_layout, contenidoTabla);

        List_View.setAdapter(myAdp);


    }catch(Exception e){
        e.printStackTrace();
    } finally {
        BaseDatos.close();
    }
}
}

DataUsuario.java

package com.example.registro;

public class DataUsuario {

private String dni;
private String nombre;
private Integer telefono;

public DataUsuario() {
    super();
}

public DataUsuario(String dni, String nombre, Integer telefono ) {
    super();
    this.dni = dni;
    this.nombre = nombre;
    this.telefono = telefono;
}

public String getDni() {
    return dni;
}

public void setDni(String dni) {
    this.dni = dni;
}

public String getNombre() {
    return nombre;
}

public void setNombre(String dni) {
    this.nombre = nombre;
}

public Integer getTelefono() {
    return telefono;
}

public void setTelefono(Integer telefono) {
    this.telefono = telefono;
}

@Override
public String toString() {
    return this.dni + " - " + this.nombre + " - " + this.telefono;
}
}

UsuarioAdapter.java

public class UsuarioAdapter extends ArrayAdapter<DataUsuario> {

private ArrayList<DataUsuario> usuarios;
private int resourceLayout;
private Context mContext;

public UsuarioAdapter(Context context, int textViewResourceId, ArrayList<DataUsuario> usuarios) {
    super(context, textViewResourceId, usuarios);
    this.resourceLayout = textViewResourceId;
    this.mContext = context;
    this.usuarios = usuarios;
}

public View getView(int position, View convertView, ViewGroup parent){

    View v = convertView;

    if (v == null) {
        LayoutInflater vi;
        vi = LayoutInflater.from(mContext);
        v = vi.inflate(resourceLayout, null);

    }

    DataUsuario i = usuarios.get(position);

    if (i != null) {
        TextView dnitag = (TextView) v.findViewById(R.id.dnitag);
        TextView dnidata = (TextView) v.findViewById(R.id.dnidata);
        TextView nombretag = (TextView) v.findViewById(R.id.nombretag);
        TextView nombredata = (TextView) v.findViewById(R.id.nombredata);
        TextView telefonotag = (TextView) v.findViewById(R.id.telefonotag);
        TextView telefonodata = (TextView) v.findViewById(R.id.telefonodata);

        // Chequeamos que los textview existan y los rellenamos
        if (dnitag != null){
            dnitag.setText("Dni: ");
        }
        if (dnidata != null){
            dnidata.setText(i.getDni());
        }
        if (nombretag != null){
            nombretag.setText("Nombre: ");
        }
        if (nombredata != null){
            nombredata.setText(i.getNombre());
        }
        if (telefonotag != null){
            telefonotag.setText("Teléfono: ");
        }
        if (telefonodata != null){
            telefonodata.setText(i.getTelefono());
        }
    }
    return v;
}
}

activity_main.xml

<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">

<Button
    android:id="@+id/button3"
    android:layout_width="121dp"
    android:layout_height="wrap_content"
    android:onClick="VerTabla"
    android:text="Ver tabla" />

<ListView
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
</LinearLayout>

persona_fila_layout.xml

</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<!-- Dni Tag -->
<TextView
    android:id="@+id/dnitag"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

<!-- Dni Data -->
<TextView
    android:id="@+id/dnidata"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

<!-- Nombre Tag -->
<TextView
    android:id="@+id/nombretag"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

<!-- Nombre Data -->
<TextView
    android:id="@+id/nombredata"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

<!-- Telefono Tag -->
<TextView
    android:id="@+id/telefonotag"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

<!-- Telefono data -->
<TextView
    android:id="@+id/telefonodata"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>

Solution

  • You can't use android:id="@+id/list".
    In your layout use:

    <ListView 
        android:id="@android:id/list"
        .....
        />
    

    Check the official doc:

    To do this, your own view MUST contain a ListView object with the id "@android:id/list" (or R.id.list if it's in code)