Android ArrayAdapter的使用

ArrayAdapter

本想偷偷懒,直接调用下别人翻译的api文档,自己直接写个例子上来,可找了半天还是没有找到翻译好的,算了只能自己动手了。(有找到可以给个地址)


先来看看对ArrayAdapter最基本的介绍吧。

一个具体的BaseAdapter能支持任意数组对象,在默认情况下这类预期提供的资源id引用的是一个TextView.如果你想使用一个更复杂的布局,使用构造函数也需要一个字段id,该字段id应该引用一个TextView在更大的布局资源。然而对TextView的引用,他会对数组里的每个对象进行toString()方法,你可以添加自定义对象的列表或者数组,覆盖你的对象的toString()方法来确定将显示在项目列表中的文本。用一些除了TextView的控件显示数组,例如ImageView,或者有一些数据除了toString()填充视图,需要覆盖getView()返回你想要的类型。

public class ArrayAdapter<T> extends BaseAdapter implements Filterable {} 继承了BaseAdapter 可以调用其中存在的一些属性方法。实现了Filterable,这里不对其做过多的解释。


构造函数:

1、public ArrayAdapter(Context context, int textViewResourceId) {
        init(context, textViewResourceId, 0, new ArrayList<T>());
    }

2、  public ArrayAdapter(Context context, int resource, int textViewResourceId) {
        init(context, resource, textViewResourceId, new ArrayList<T>());
    }

3、 public ArrayAdapter(Context context, int textViewResourceId, T[] objects) {
        init(context, textViewResourceId, 0, Arrays.asList(objects));
    }

4、public ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects) {
        init(context, resource, textViewResourceId, Arrays.asList(objects));
    }

5、  public ArrayAdapter(Context context, int textViewResourceId, List<T> objects) {
        init(context, textViewResourceId, 0, objects);
    }

6、 public ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects) {
        init(context, resource, textViewResourceId, objects);
    }

这六个构造函数其中最多包括的参数有4个,Context 当前上下文,布局文件(可以省略),textView资源id和 数据来源(数组或者集合),同样都调用了一个init()函数。

 private void init(Context context, int resource, int textViewResourceId, List<T> objects) {
        mContext = context;
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mResource = mDropDownResource = resource;
        mObjects = objects;
        mFieldId = textViewResourceId;
    }

分别赋值给类中的私有域,mInflater为LayoutInflater,产生相应项的视图。

 mResource = mDropDownResource = resource;显示填充视图内容的资源

类中有两个域保存数据 

 private List<T> mObjects;

 private ArrayList<T> mOriginalValues;

其中mOriginalValues用于过滤数据时保存过滤前的数据,将过滤后的数据存入mObjects。



在ArrayAdapter中还定义了add,insert,remove,clear函数用于改变数据,并定义了一个布尔变量mNotifyChange用于表示用这些函数改变数据后是否通知视图(调用notifyDataSetChanged,调用这个函数时会把mNotifyChange置为true。

还定义了createViewFromResource用来创建视图, 在createViewFromResource中,首先判断convertView是否存在,若不存在则inflate一个,然后判断mFieldID是否为0,若为0则表示传递给ArrayAdapter的资源ID为一TextView,否则是传递了一Layout,mFieldID为此Layout中TextView的ID。然后通过getItem取得相应位置的数据项,判断是否是CharSequence的实例,如果是直接setText,否则调用其toString()函数,可以ArrayAdapter默认只能给TextVext设置字符串,若要使用其他视图,需要重载getView或getDropDownView,一般情况下会继承BaseAdapter自定义自己的Adapter。
静态函数
    public static ArrayAdapter<CharSequence> createFromResource(Context context,
            int textArrayResId, int textViewResId) {
        CharSequence[] strings = context.getResources().getTextArray(textArrayResId);
        return new ArrayAdapter<CharSequence>(context, textViewResId, strings);
    }

 读取资源文件中定义的字符数组作为数据生成ArrayAdapter,可以看到只能用TextView视图,而不可以指定一Layout再指定Layout中一个TextView的ID。

在ArrayAdapter中还定义了一个ArrayFilter,继承自Filter,用于过滤数据项(当ListView有焦点时,通过键盘输入字符来进行列表项的过滤),其过滤方法为传入一CharSequence,判断相应数据项是否以此CharSequence开头,若不是则用空格分割些数据项,判断分割后的各字符串是否以此CharSequence开头,若是则保留(若数据不是CharSequence则调用其toString())。如果传入的CharSequence为null或长度为0则不过滤。

(这里就不介绍了,有兴趣的同学 可以研究下)

说了这么多一直在介绍文档,相信很多人都看不下去了,那接下来就开始上示例了。


1.最简单的使用。
public class ArrayAdapterActivity extends Activity{
	private ListView listView;
	private String[] strs = {"测试数据1","测试数据2","测试数据3","测试数据4","测试数据5"};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		listView = new ListView(this);
//		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strs);
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData());
		listView.setAdapter(adapter);
		setContentView(listView);
	}
	  private List<String> getData(){
          List<String> data = new ArrayList<String>();
          data.add("测试数据1");
          data.add("测试数据2");
          data.add("测试数据3");
          data.add("测试数据4");
          data.add("测试数据5");
          return data;
      }
}
两种数据来源 ,分别是数组和集合。
android.R.layout.simple_expandable_list_item_1是自带的效果
下面是实施效果:


当然也可以自己添加样式,注意xml文件只能是TextView 不能是layout,否则会报错,下面是自己写的样式,textv.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:id="@+id/tv"
    android:textColor="#ff0000"
    >
</TextView>
这里我把颜色变成了红色,把android.R.layout.simple_expandable_list_item_1换成自己的文件R.layout.textv即可,效果如下:

2.比较复杂的,自己的布局文件layout,需要有textView。布局文件csarrayada.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="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tvcslayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ArrayAdapter测试layout嵌套textview"
        android:textSize="18sp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="测试" />

</LinearLayout>
需要把activity中的代码改为:ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.csarrayada,R.id.tvcslayout,getData());

运行效果如下,包含了其他控件:

3.最复杂的,仅仅一个textView不够用,进行自定义ArrayAdapter,重写GetView()方法。

在此之前需要写一个实体类,用于ArrayAdapter的范型,我这里写的是User类
public class User {
	private String name;
	private int age;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	private String sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
}
下面是自定义的zdyarrayAdapter
public class zdyArrayAdapter extends ArrayAdapter<User>{
	private int resourceId;  
	public zdyArrayAdapter(Context context, int resourceId, List<User> objects) {  
		super(context, resourceId, objects);  
		this.resourceId = resourceId;  
	}  

	@Override  
	public View getView(int position, View convertView, ViewGroup parent){  
		User user = getItem(position);  
		LinearLayout userListItem = new LinearLayout(getContext());  
		String inflater = Context.LAYOUT_INFLATER_SERVICE;   
		LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater);   
		vi.inflate(resourceId, userListItem, true);  
		TextView tvUsername = (TextView)userListItem.findViewById(R.id.tvusername);  
		TextView tvUserage = (TextView)userListItem.findViewById(R.id.tvuserage);  
		TextView tvUsersex = (TextView)userListItem.findViewById(R.id.tvusersex);  
		tvUsername.setText(user.getName());  
		tvUserage.setText(String.valueOf(user.getAge()));  
		tvUsersex.setText(user.getSex());  
		return userListItem;  
	}  
}
activity中填充数据:
List<User> users = new ArrayList<User>();
		User u1=new User();
		u1.setName("张三");
		u1.setAge(11);
		u1.setSex("男");
		
		User u2=new User();
		u2.setName("李四");
		u2.setAge(12);
		u2.setSex("女");
		users.add(u1);
		users.add(u2);
		zdyArrayAdapter adapter = new zdyArrayAdapter(this,R.layout.userlayout,users);
		listView.setAdapter(adapter);
		setContentView(listView);

运行效果如下
满足了一些我们需要的样式。

好了,ArrayAdapter就介绍到这里吧,有需要补充的和写的不好不对的地方,欢迎指教。







  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值