不同的注释对应不同的构造方法
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;
}
@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>
<?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>