【Android】ListAdapter的常用的子类


一、ListAdapter

1.继承关系

在这里插入图片描述
常用的子类是ArrayAdapter、SimpleAdapter、BaseAdapter。

PS:RecyclerAdapter不是继承的子类,老搞混。

2.用于

  • 用在ListView控件上,listview.setAdapter(adapter);
  • 用在AlertDialog上,builder.setAdapter()

二、ArrayAdapter(数组适配器)

1.原型

ArrayAdapter(
	Context context,
	@LayoutRes int resource,
	Object[] objects
)

ArrayAdapter()参数:

  • context:context上下文对象

  • resource:每一个item的样式。
    可以使用系统提供的布局样式,也可以使用自定义的布局样式。

  • objects:要显示的数据
    可以是String数组,也可以List泛型容器。

系统提供的item的样式,可以试一试

  • simple_list_item1:单独的一行文本框

  • simple_list_item2:有两个文本框组成

  • simple_list_item_checked:每项都是由一个已选中的列表项

  • simple_list_item_multiple_choice:都带有一个复选框

  • simple_list_item_single_choice:都带有一个单选框

2.ArrayAdapter构建例子

(1)String数组

String[] str={"Just","do","it"};
ArrayAdapter<String> arrayAdapter=new ArrayAdapter<>(
	MainActivity.this,
	android.R.layout.simple_list_item_1,
	str);

(2)List泛型容器

List<String> data = new ArrayList<>();
data.add("Just");
data.add("do");
data.add("it");
ArrayAdapter<String> arrayAdapter=new ArrayAdapter<>(
	MainActivity.this,
	android.R.layout.simple_list_item_1,
	data);

(3)自定义

四步:

  • 定义Fruit类
  • 定义Item的布局
  • 定义继承ArrayAdapter的FruitAdapter
  • MainActivity.java中创建(之后就是绑到谁身上)

定义Fruit类

package com.example.hello;

public class Fruit {
    private String mName;
    private int mImageId;

    public Fruit(String name,int ImageId)
    {
        mName=name;
        mImageId=ImageId;
    }

    public String getmName()
    {
        return mName;
    }

    public int getmImageId()
    {
        return mImageId;
    }
}

定义Item的布局:layout.xml

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/fruit_name"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fruit_image"/>

</LinearLayout>

定义继承ArrayAdapter的FruitAdapter

package com.example.hello;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class FruitAdapter extends ArrayAdapter<Fruit> {
    private int mresource;

    public FruitAdapter(Context context, int resource, List<Fruit> objects) {
        super(context, resource, objects);
        mresource=resource;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Fruit fruit=getItem(position);
        View view= LayoutInflater.from(getContext()).inflate(mresource,parent,false);
        ImageView fruitImage=view.findViewById(R.id.fruit_image);
        TextView fruitText=view.findViewById(R.id.fruit_name);
        fruitImage.setImageResource(fruit.getmImageId());
        fruitText.setText(fruit.getmName());
        return view;
    }
}

MainActivity.java中创建

List<Fruit> data = new ArrayList<>();
data.add(new Fruit("banana",R.drawable.banana));
data.add(new Fruit("watermelon",R.drawable.watermelon));
FruitAdapter fruitAdapter=new FruitAdapter(
	MainActivity.this,
	R.layout.layout,
	data);

绑定到ListView上的效果。
在这里插入图片描述

三、SimpleAdapter

1.原型

SimpleAdapter(
	Context context ,
	List<?extends<Map<String,?>> data,
	int resource , 
	String[] from , 
	int[] to
)

五个参数:

  • context:上下文对象

  • data:数据源,一个含有Map的List容器
    Map中的Key是自己给每个条目中几个控件随便起的名字,控件A,控件B,控件C
    Map中的Value是对应的资源内容,如控件中图片的R索引id,控件中文字的内容

  • resource:每一个item的布局文件

  • from:每个值就是data中的存入map集合的的key值
    new String[]{}数组。

  • to:每个值就是引用resource布局文件中的控件R.id
    new int[]{}数组。

2.SimpleAdapter构建

两步:

  • 定义Item的布局
  • MainActivity.java中创建SimpleAdapter(之后就是绑到控件上)

(1)定义Item的布局

listview_item.xml用来自定义条目的样式。

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/fruit_name"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fruit_image"/>

</LinearLayout>

(2)创建

final List<Map<String,Object>> list=new ArrayList<>();
final int price[]={R.drawable.banana,R.drawable.watermelon};
final String[] name={"banana","watermelon"};
for(int i=0;i<name.length;i++)
{
    Map<String,Object> map=new HashMap<>();
    map.put("name",name[i]);
    map.put("price",price[i]);
    list.add(map);
}
SimpleAdapter simpleAdapter=new SimpleAdapter(
        MainActivity.this,
        list,
        R.layout.layout,
        new String[]{"name","price"},
        new int[]{R.id.fruit_name,R.id.fruit_image}
);

绑定到AlertDialog上的效果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误信息表示在 Android 应用程序中,你试图在一个空对象引用上调用 `ListView.setAdapter(ListAdapter)` 方法,从而导致了空指针异常。 出现这个错误的原因可能是在调用 `ListView.setAdapter(ListAdapter)` 方法之前,你没有正确地初始化或者找到对应的 `ListView` 对象。要解决这个问题,你需要检查代码中关于 `ListView` 对象的初始化部分,确保它们被正确地初始化并且不为 null。 你也可以在代码中加入一些调试语句,打印出 `ListView` 对象的引用值,以便更好地排查问题所在。 ### 回答2: 这个错误是由于在程序运行时,尝试对一个空对象引用进行虚拟方法调用,造成了程序崩溃的情况。具体来说,是在使用ListView控件时,没有先进行初始化或设置Adapter,而直接进行其他操作导致的错误。 解决这个问题需要检查代码中ListView的初始化和Adapter的设置,确保它们都不为空。如果ListView为空,需要先进行初始化,可以使用findViewById方法获取ListView控件的引用,然后再进行其他操作。如果Adapter为空,则需要先创建一个Adapter对象,并将其设置给ListView。同时,还需要注意在设置Adapter时,不能传入空对象,否则仍会出现空指针异常。 另外,为了避免出现这种错误,编写代码时应注意检查对象的是否为空,避免使用null引用进行操作。同时,对于一些关键的操作,也可以使用try-catch语句进行异常处理,以避免程序崩溃。最好的方法是在开发过程中,养成良好的编码习惯,以提高代码的质量和可靠性。 ### 回答3: 这个错误的意思是在尝试调用一个空对象的方法。一般来说,当我们用到“.”点操作符去调用某个对象的方法时,如果该对象为空,就会出现这个错误。 在 Android 中,一般会出现这个错误的情况是:我们在试图将一个空的 ListView 控件绑定到一个适配器(ListAdapter)上。这时候,我们必须要先实例化 ListView 对象,然后才能去绑定适配器。 解决这个问题的方法很简单,我们只需要在绑定适配器之前进行一次非空判断即可,代码可以写成这样: ListView listView = findViewById(R.id.list_view); if (listView != null) { listView.setAdapter(adapter); } 这样,就可以确保 listView 对象非空,避免出现空指针异常。 除此之外,我们还可以使用调试工具来帮助我们找出错误发生的位置和原因,并对代码进行优化。例如,我们可以使用 Logcat 来输出调试信息,还可以使用 Android Studio 自带的调试工具进行代码调试。这些工具都能够帮助我们更加有效地定位并解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值