ArrayAdapter应用详解:如何优雅地创建自定义列表

作者:嘉峪关淘贝游戏开发公司 阅读:80 次 发布时间:2023-06-29 21:55:56

摘要:ArrayAdapter应用详解:如何优雅地创建自定义列表ArrayAdapter是Android开发中非常常用的一个类,它可以很方便地创建列表,例如ListView、Spinner等控件。本文将详细介绍如何使用ArrayAdapter创建自定义列表,并分享一些优雅的编程技巧。一、准备工作在使用ArrayAdapter之前,...

ArrayAdapter应用详解:如何优雅地创建自定义列表

ArrayAdapter是Android开发中非常常用的一个类,它可以很方便地创建列表,例如ListView、Spinner等控件。本文将详细介绍如何使用ArrayAdapter创建自定义列表,并分享一些优雅的编程技巧。

一、准备工作

在使用ArrayAdapter之前,需要准备好列表控件,这里以ListView为例。首先,在布局文件中定义ListView:

```xml

android:id="@+id/listView"

android:layout_width="match_parent"

android:layout_height="match_parent" />

```

然后,在Activity中找到ListView对象,并为其设置Adapter:

```java

ListView listView = findViewById(R.id.listView);

ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new String[]{"Item 1", "Item 2", "Item 3"});

listView.setAdapter(adapter);

```

这段代码的意思是,创建一个ArrayAdapter对象,该对象的泛型为String,使用系统自带的simple_list_item_1布局,然后将三个字符串作为列表的内容,并将该Adapter设置到ListView中。

此时,运行程序可以看到一个简单的列表,其中包含三个字符串。

二、自定义列表项布局

如果想要让列表项显示更为复杂的内容,比如一张图片加上一段文字,可以自定义列表项布局。下面是一个例子,布局文件名为item_layout.xml:

```xml

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:padding="16dp">

android:id="@+id/imageView"

android:layout_width="80dp"

android:layout_height="80dp"

android:src="@drawable/ic_launcher_background"/>

android:id="@+id/textView"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginStart="16dp"

android:textSize="24sp"

android:text="Item"/>

```

可以看到,该布局使用了LinearLayout作为根布局,并包含了一个ImageView和一个TextView。

接下来,可以通过修改ArrayAdapter的构造函数,将自定义的布局传递进去:

```java

ArrayAdapter adapter = new ArrayAdapter<>(this, R.layout.item_layout, R.id.textView, new String[]{"Item 1", "Item 2", "Item 3"});

```

这里除了传递布局文件外,还传递了一个textView的ID,指定了TextView用于显示每个列表项的文字。

运行程序,可以看到ListView中每个列表项都包含一张图片和一段文字,与自定义的布局文件一致。

三、重写getView方法

在使用自定义布局之后,可能还需要对每个列表项进行更为灵活的定制。这时候就需要重写ArrayAdapter的getView方法。

在重写getView方法之前,可以先理解该方法的原理。默认的ArrayAdapter会根据布局文件中指定的View ID,找到对应的View,并将数据填充到View中。如果想要对View的显示效果进行更改,就需要对getView方法进行重写。

下面是一个重写getView方法的例子:

```java

ArrayAdapter adapter = new ArrayAdapter(this, 0, new String[]{"Item 1", "Item 2", "Item 3"}) {

@NonNull

@Override

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

if (convertView == null) {

convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_layout, parent, false);

}

ImageView imageView = convertView.findViewById(R.id.imageView);

TextView textView = convertView.findViewById(R.id.textView);

String item = getItem(position);

textView.setText(item);

switch (position % 3) {

case 0:

imageView.setImageResource(R.drawable.image1);

break;

case 1:

imageView.setImageResource(R.drawable.image2);

break;

case 2:

imageView.setImageResource(R.drawable.image3);

break;

}

return convertView;

}

};

```

可以看到,该方法首先判断convertView是否为空,如果为空则将自定义的布局文件转化为View对象。然后,根据传入的位置,为ImageView设置不同的图片,并将字符串填充到TextView中。

运行程序,可以看到ListView中每个列表项都有不同的图片和文字内容。

四、使用ViewHolder优化性能

在使用 getView 方法时,由于列表项复用的原因,会出现多个 View 对象被反复 Inflate,导致性能开销过大的情况。这时候,我们可以使用ViewHolder来保存 View 对象,避免重复 Inflate。

下面是使用 ViewHolder 的例子:

```java

ArrayAdapter adapter = new ArrayAdapter(this, 0, new String[]{"Item 1", "Item 2", "Item 3"}) {

@NonNull

@Override

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

ViewHolder holder;

if (convertView == null) {

convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_layout, parent, false);

holder = new ViewHolder();

holder.imageView = convertView.findViewById(R.id.imageView);

holder.textView = convertView.findViewById(R.id.textView);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

String item = getItem(position);

holder.textView.setText(item);

switch (position % 3) {

case 0:

holder.imageView.setImageResource(R.drawable.image1);

break;

case 1:

holder.imageView.setImageResource(R.drawable.image2);

break;

case 2:

holder.imageView.setImageResource(R.drawable.image3);

break;

}

return convertView;

}

class ViewHolder {

ImageView imageView;

TextView textView;

}

};

```

可以看到,该方法首先判断 convertView 是否为空,如果为空,则将自定义的布局文件转化为 View 对象,并将 ViewHolder 对象绑定到该 View 上。如果不为空,则将已有的 ViewHolder 对象从 convertView 中取出来。

在填充数据时,直接通过 ViewHolder 就能找到绑定的 View 对象,避免多次调用 findViewById 方法,进而提升性能。

五、总结

通过上述的介绍,我们不难发现,ArrayAdapter 是一个非常强大的工具,可以帮助我们快速创建列表,同时通过修改 getView 方法,可以定制每个列表项的显示内容。如果配合 ViewHolder 使用,则可以避免 View 反复 Inflate 的问题,使 ListView 整体的性能得到极大提升。

  • 原标题:ArrayAdapter应用详解:如何优雅地创建自定义列表

  • 本文链接:https://qipaikaifa1.com/tb/13906.html

  • 本文由嘉峪关淘贝游戏开发公司小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与淘贝科技联系删除。
  • 微信二维码

    CTAPP999

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:189-2934-0276


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部