【问题标题】:Custom ArrayAdapter for a ListView (Android)ListView 的自定义 ArrayAdapter (Android)
【发布时间】:2019-07-30 19:01:05
【问题描述】:

我正在尝试使用自定义 ArrayAdapter 显示 Listview,但我不知道我的错误是什么。控制台显示此错误:

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.registro/com.example.registro.MainActivity}:java.lang.RuntimeException:您的内容必须有一个 id 属性为 'android.R .id.list'。

谁能帮帮我。谢谢

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>

【问题讨论】:

  • 您将另一个答案标记为正确。

标签: android android-studio android-layout android-listview


【解决方案1】:

不能使用 android:id="@+id/list"
在您的布局中使用:

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

查看official doc

为此,您自己的视图必须包含一个 ID 为 "@android:id/list"ListView 对象(或 R.id.list,如果它在代码中)

【讨论】:

    【解决方案2】:

    您的错误日志告诉您解决方案:

    您的内容必须有一个 id 属性为 'android.R.id.list' 的 ListView。

    将列表视图的 id 更改为 @android:id/list,如下所示:

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

    您需要这样做,因为您正在扩展ListActivity。在任何其他活动中都不需要这样做。

    另外请注意,由于 ListActivity 是 android.app.Activity 而不是 AppCompatActivity 的子类,因此您将无法使用提供的向后兼容功能。

    如果您想使用 AppCompat,最好将ListView 添加到您的AppCompatActivity,而不是扩展ListActivity

    编辑
    还要替换 onCreate() 中的findViewByid(),因为 ListActivity 已经具有返回 ListView 的函数:

    List_View = getListView();
    

    【讨论】:

    • 也许 RecyclerView 比 ListView 更好。
    • 谢谢,但现在我遇到了另一个错误。构建输出显示错误:在这一行中找不到符号变量列表 ListView List_View = (ListView) findViewById(R.id.list);
    • @FranRouco 请使用getListView() 函数来获取ListView,而不是使用findViewById()。看看我上次的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多