ListView作为android中最常用的一种控件,与他关联的各种自定义、布局、事件以及适配器是我们经常遇到的。
而我们在看适配器时,有时候真的会看花眼,因为它的多样性,它的实现类真的很多:
ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter。
这里,详细介绍ArrayAdapter的各种重载,因为不仔细看,这确实会引起混乱。
重载有以下几种方法:
我们从上到下,用简单的例子来表现这些重载:
1、 ArrayAdapter(Context context, int resource)
这里的两个参数,context代表上下文,resource在API中的说明是这样的:The resource ID for a layout file containing a TextView to use when instantiating views
意思为:这个resource是一个包含TextView属性的layout布局。根据说明,我们写法如下:
package com.example.r_layout_csdn;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
ListView listView;
ArrayAdapter<String> arrayAdapter;
List<String> listStrings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
public void init()
{
listView=(ListView)findViewById(R.id.mylist);
arrayAdapter=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1);
arrayAdapter.add("举头望明月");
arrayAdapter.add("低头思故乡");
listView.setAdapter(arrayAdapter);arrayAdapter.notifyDataSetChanged();}}
这里我们的布局采用的是: android.R.layout.simple_list_item_1,这是系统提供的一种布局方式,而它也是一个包含TextView属性的layout。
这是一个十分常用的方式。但这样我们好像没法直观的感受到The resource ID for a layout file containing a TextView to use when instantiating views,这说明的意义,因此,我们用一个自定义的布局来替换这个系统布局。如下:
新增布局名称为item.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mytext"
android:layout_width="wrap_content"
android:layout_height="match_parent" >
</TextView>
在这个布局里,你可以看到它的根标签就是TextView,而不是我们常见的线性布局、相对布局等标签。如果在这个TextView外包含一层标签,程序会提示你无法找到这个TextView。
有了这个自定义布局。我们改写如下方法:
package com.example.r_layout_csdn;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
ListView listView;
ArrayAdapter<String> arrayAdapter;
List<String> listStrings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
public void init()
{
listView=(ListView)findViewById(R.id.mylist);
arrayAdapter=new ArrayAdapter<String>(MainActivity.this, R.layout.item);
arrayAdapter.add("举头望明月");
arrayAdapter.add("低头思故乡");
listView.setAdapter(arrayAdapter);
arrayAdapter.notifyDataSetChanged();
}
}
以上的两个结果是一样的。
2、ArrayAdapter(Context context,int resource,int textViewResourceId)
这里三个参数:context上下文,resource含有TextViw属性的layout布局,textViewResourceId这个就是resource布局里的TextView的Id。
我们还是使用item.xml布局:
arrayAdapter=new ArrayAdapter<String>(MainActivity.this, R.layout.item, R.id.mytext);
arrayAdapter.add("但使龙城飞将在");
arrayAdapter.add("不叫胡马度阴山");
3、ArrayAdapter(Context context,int resource,List<T> objects)
这里的三个参数:context上下文,resource布局(这里较常使用的是系统提供的布局文件,当然你也可以用给自己的),List<T>数据。
这个重载,需要我们提供List<T>,OK,我们定义并赋值。代码如下:
List<String> listStrings=new ArrayList<String>();
listStrings.add("白日依山尽");
listStrings.add("黄河入海流");
listStrings.add("欲穷千里目");
listStrings.add("更上一层楼");
arrayAdapter=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, listStrings);
这个重载是我们日常使用最频繁的,因为简便。
4、ArrayAdapter(Context context,int resource,T[] objects)
这个与上一个重载唯一不同的地方在于第三个参数。这是一个泛型数组。
那我们也给它定义并赋值,代码如下:
String[] lsStrings={"天生我才必有用","千金散尽还复来"};
arrayAdapter=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, lsStrings);
5、ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
这里的参数,到现在大家应该也一目了然了。上下文、layout布局、TextView的Id、数据。
代码如下:
listStrings=new ArrayList<String>();
listStrings.add("白日依山尽");
listStrings.add("黄河入海流");
listStrings.add("欲穷千里目");
listStrings.add("更上一层楼");
arrayAdapter=new ArrayAdapter<String>(MainActivity.this, R.layout.item, R.id.mytext, listStrings);
6、ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
与第5个重载相比,区别在于最后一个泛型数组参数。
代码如下:
String[] lsStrings={"红豆生南国","春来发几枝"};
arrayAdapter=new ArrayAdapter<String>(MainActivity.this, R.layout.item, R.id.mytext, lsStrings);
后续,再介绍Adapter的其他继承接口与实现类。
OVER.