自定义数组适配器

Customed ArrayAdapter

我创建了一个名为 Categoria 的 class,它有两个属性(String nombre,int id)。

我创建了一个包含 Categoria 类型元素的 ArrayList。

当我在 ListView 上显示 ArrayList 时,我得到:

而不是这个,我想要显示属性 nombre,它是一个字符串。 ArrayAdapter 必须是 Categoria 类型,而不是 String。

我该怎么做?也许创建一个自定义适配器?

这是一段代码:

public class MainActivity extends AppCompatActivity {

private ArrayList<Categoria> lista;
private ArrayAdapter<Categoria> adaptador;
private ListView view_lista;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    adaptador = new ArrayAdapter<Categoria>(this, android.R.layout
            .simple_list_item_1, lista);
    view_lista = (ListView)findViewById(R.id.view_lista);
    view_lista.setAdapter(adaptador);

这是 simple_list_item_1 布局:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:minHeight="?android:attr/listPreferredItemHeightSmall" />

谢谢:)

最简单的方法是只将 ArrayList 传递给适配器。

如果您想将 Categoria 对象传递给您的适配器,您必须为其编写您自己的自定义适配器。

link 包含有关该场景的很好示例。

adaptador = new ArrayAdapter<Categoria>(this, android.R.layout
            .simple_list_item_1, lista);

在这里,您将 ArrayList (lista) 传递给适配器。然后适配器将只调用 ArrayList 中每个对象的 toString() 方法。

因此您可以将 Categoria class 中的 toString() 方法覆盖为 return nombre 属性。

@Override
public String toString(){
   return this.nombre;
}

您还可以创建一个 ArrayList<String> 而不是 ArrayList<Categoria>,并且只添加 nombre 属性(而不是整个 Categoria 对象)。 另一种选择是创建您自己的 ArrayAdapter 并自定义 getView() 方法中显示的内容。

看看this问题

默认情况下,ArrayAdapter 将显示由对象的 toString 方法编辑的文本 return。在这种简单的情况下,您可以简单地为 Categoria 和 return 覆盖 nombre 字段的 toString 方法:

public class Categoria {
  ...

    @Override
    public String toString() {
        return this.nombre;
    }
}

如果您的应用程序需要更改并且您需要更复杂的布局,您可以覆盖 ArrayAdaptergetView 方法以将数据从 Categoria 绑定到更复杂的视图。