简体   繁体   English

ListView 的自定义 ArrayAdapter (Android)

[英]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.我正在尝试使用自定义 ArrayAdapter 显示Listview ,但我不知道我的错误是什么。 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'. java.lang.RuntimeException: 无法启动活动列表'。

Can someone help me.有人能帮我吗。 Thank you谢谢

MainActivity.java主活动.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 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使用适配器.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活动_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 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>

Your error log is telling you the solution to this:您的错误日志告诉您解决方案:

Your content must have a ListView whose id attribute is 'android.R.id.list'.您的内容必须有一个 id 属性为“android.R.id.list”的 ListView。

Change id of your listview to @android:id/list like this:像这样将列表视图的 id 更改为@android:id/list

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

You need to do this because you are extending ListActivity .您需要这样做,因为您正在扩展ListActivity It is not required to do this in any other activity.在任何其他活动中都不需要这样做。

Also please note that since ListActivity is subclass of android.app.Activity instead of AppCompatActivity, you won't be able to use backward compatibility features provided.另请注意,由于 ListActivity 是android.app.Activity而不是 AppCompatActivity 的子类,因此您将无法使用提供的向后兼容功能。

If you want to use AppCompat, it is better to add ListView to the your AppCompatActivity instead of extending ListActivity .如果您想使用 AppCompat,最好将ListView添加到您的AppCompatActivity而不是扩展ListActivity

Edit :编辑
Also replace the findViewByid() in your onCreate() since ListActivity already has the function that returns the ListView:还要替换 onCreate() 中的findViewByid() ,因为 ListActivity 已经具有返回 ListView 的函数:

List_View = getListView();

You can't use android:id="@+id/list" .不能使用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)为此,您自己的视图必须包含一个 ID 为"@android:id/list"ListView对象(或 R.id.list,如果它在代码中)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM