Android ArrayAdapter 详解

不同的注释对应不同的构造方法

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class Main11Activity extends AppCompatActivity {
    ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main11);
        listView = (ListView) findViewById(R.id.listView);

        //适配的数据可以为T[],List<T>,但最终都会被转成List<T>
        ArrayList<String> list = new ArrayList<>();
        for(int i = 'A'; i<='Z'; i++){
            list.add((char)i+"");
        }

        //使用不带数据参数的构造方法默认会new ArrayList<>(),由于size为0,所以不显示任何东西
        //MyArrayAdapter myArrayAdapter = new MyArrayAdapter(this,android.R.layout.simple_list_item_1);

        //使用系统自带布局android.R.layout.simple_list_item_1(该布局内只有一个TextView(没有LinearLayout等))
        //使用自定义布局也只能有一个TextView(不能有其它控件)
        // 否则会报异常(Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView)
        //MyArrayAdapter myArrayAdapter = new MyArrayAdapter(this,android.R.layout.simple_list_item_1,list);

        //使用不只含有TextView的自定义布局
        //第二个参数:布局ID
        //第三个参数:布局里面的TextView的ID
        MyArrayAdapter myArrayAdapter = new MyArrayAdapter(this,R.layout.item_array,R.id.item_array_tv,list);
        listView.setAdapter(myArrayAdapter);
    }

    class MyArrayAdapter extends ArrayAdapter<String>{

        public MyArrayAdapter(Context context, int resource) {
            super(context, resource);
        }

        public MyArrayAdapter(Context context, int resource, List<String> objects) {
            super(context, resource, objects);
        }

        public MyArrayAdapter(Context context, int resource, String[] objects) {
            super(context, resource, objects);
        }
        //resource:布局文件的ID,textViewResourceID:此布局中TextView控件的ID
        public MyArrayAdapter(Context context, int resource, int textViewResourceId) {
            super(context, resource, textViewResourceId);
        }

        public MyArrayAdapter(Context context, int resource, int textViewResourceId, List<String> objects) {
            super(context, resource, textViewResourceId, objects);
        }

        public MyArrayAdapter(Context context, int resource, int textViewResourceId, String[] objects) {
            super(context, resource, textViewResourceId, objects);
        }
    }
}

不管哪个构造方法最终都将调用此方法(如果没有textViewID则系统默认传0进去)

public ArrayAdapter(@NonNull Context context, @LayoutRes int resource,
		@IdRes int textViewResourceId, @NonNull List<T> objects) {
	mContext = context;
	mInflater = LayoutInflater.from(context);
	mResource = mDropDownResource = resource;
	mObjects = objects;
	mFieldId = textViewResourceId;
}


getView源码

@Override
public @NonNull View getView(int position, @Nullable View convertView,
		@NonNull ViewGroup parent) {
	return createViewFromResource(mInflater, position, convertView, parent, mResource);
}

private @NonNull View createViewFromResource(@NonNull LayoutInflater inflater, int position,
		@Nullable View convertView, @NonNull ViewGroup parent, int resource) {
	final View view;
	final TextView text;

	if (convertView == null) {
		view = inflater.inflate(resource, parent, false);
	} else {
		view = convertView;
	}

	try {
		if (mFieldId == 0) {
			//  If no custom field is assigned, assume the whole resource is a TextView
			//由于将View强转成TextView,所以相应的构造方法加载的布局文件内只能有TextView
			text = (TextView) view;
		} else {
			//  Otherwise, find the TextView field within the layout
			text = (TextView) view.findViewById(mFieldId);

			if (text == null) {
				throw new RuntimeException("Failed to find view with ID "
						+ mContext.getResources().getResourceName(mFieldId)
						+ " in item layout");
			}
		}
	} catch (ClassCastException e) {
		Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
		throw new IllegalStateException(
				"ArrayAdapter requires the resource ID to be a TextView", e);
	}

	final T item = getItem(position);
	//如果传进来的数据为字符类型则直接使用,否则将调用toStriing转成字符类型再设置TextView的值
	if (item instanceof CharSequence) {
		text.setText((CharSequence) item);
	} else {
		text.setText(item.toString());
	}

	return view;
}

activity_main11.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main11"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.yongyida.robot.voice.test.Main11Activity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>

</LinearLayout>


item_array.xml

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

    <TextView
        android:id="@+id/item_array_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:text="btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>




由于默认继承ArrayAdapter最终只能在一个TextView上展示数据,如果需要复杂的布局来展示数据则需重写getView()方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值