你的位置:首页 > 操作系统

[操作系统]android开发之路08(ListViewAdapter)


ListView控件介绍:用于将数据库中的数据或者网络中的数据通过列表的形式显示出来;ListView采用MVC模式将前端显示和后端数据进行分离。 也就是说,ListView控件在装载数据时并不是直接使用ListView.add或者类似的方法添加数据,而是需要指定一个Adapter对象。该对象相当于MVC模式中的C(控制器),ListView相当于MVC模式中的V(视图),用于显示数据。为ListView提供数据的List或数组相当于MVC模式中的M(模型)在ListView控件中通过Adapter对象获得需要显示的数据,在创Adapter对象时需要指定要显示的数据(List或数组对象),因此,要显示的数据与ListView之间通过Adapter对象进行连接,同时又互相独立,也就是说,ListView只知道显示的数据来自Adapter,并不知道这些数据是来自List还是数组。

1.ListView应用实例(这里是在java代码中操作listview对象的):

public class MyListActivity extends ListActivity{

//定义一个字符串数组,代表我们的数据源

private  static final String[] COUNTRIES=new String[]{"中国","法国","美国","德国","日本","朝鲜","印度"};

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//把我们需要展现的数据展现到ListView上

setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item,COUNTRIES));

//通过getListView()方法获取listview对象

ListView lv=getListView();

lv.setTextFilterEnabled(true);

Log.e("MyListActivity", "listview界面产生了");

lv.setOnItemClickListener(new OnItemClickListener() {

 

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

//通过getText()方法获取用户选择的ListView中的选项信息

Log.e("MyListActivity", "列表选项被点击了,看看会出现什么");

Toast.makeText(getApplicationContext(), ((TextView)view).getText(), Toast.LENGTH_LONG).show();

}

 

});

}

}

列表项文件如下:

<?

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:padding="10dp"

    android:textSize="16sp">

</TextView>

 

Java代码①:

public class MyActivity extends Activity{

private ListView listview;

private ArrayAdapter<String> adapter;

//定义一个数据源

private List<String> data=null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//获取数据源

data=MyDataSource.getDataSource();

adapter=new ArrayAdapter<String>(this, R.layout.list_item, data);

listview=(ListView) findViewById(R.id.listview);

//将数据源通过adapter显示到listview视图上

listview.setAdapter(adapter);

 

 

}

}

Java代码②:

 

public class MyDataSource {

 

public MyDataSource() {

super();

}

 

public static List<String> getDataSource(){

List<String> list=new ArrayList<String>();

list.add("北京");

list.add("上海");

list.add("广州");

list.add("湖北");

list.add("湖南");

list.add("深圳");

list.add("西安");

 

return list;

 

}

 

}

 

布局文件activity_main.代码:

<RelativeLayout 

    android:layout_width="match_parent"

    android:layout_height="match_parent">

 

    <ListView

        android:id="@+id/listview"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:text="@string/hello_world" />

 

</RelativeLayout>

 

列表项list_item.代码:

<?

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:padding="10dp"

    android:textSize="16sp">

</TextView>

 

2.ListView应用实例:

在上面的两个例子中我们用的都是ArrayAdapter(数组适配器),这个适配器显示的数据源比较单一;而SimpleAdapter能定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等; 

下面我们就来看看如何使用SimpleAdapter

①MainActivity.java

public class MainActivity extends Activity {

private ListView mListView;

private SimpleAdapter mSimpleAdapter=null;

private List<Map<String, Object>> data=null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mListView=(ListView) findViewById(R.id.listview);

data=new ArrayList<Map<String,Object>>();

/**

 * setAdapter方法:

 * 第一个参数:是一个Context的对象;

 * 第二个参数:是一个集合,采用这样的形式List<Map<String, Object>>,为什么呢?

 * 这里的List<E>用来存储listview中的列表项,而List<E>集合中的每一个元素,又都有自己的特征

 * 因此我们通过用map集合代表list的元素的方式,完成了listview数据展示的多元化;

 * 第三个参数:是一个布局文件,用来展示listview的每个列表项的内容

 * 第四个参数:是我们List<Map<String, Object>>中Map<key,value>的key的数组表示;

 * 第五个参数:使我们List<Map<String, Object>>中Map<key,value>的value的数组表示;

 */

Map<String, Object> mMap1=new HashMap<String, Object>();

mMap1.put("title", "我是第一个功能");

mMap1.put("icon", R.drawable.ic_launcher);

Map<String, Object> mMap2=new HashMap<String, Object>();

mMap2.put("title", "我是第二个功能");

mMap2.put("icon", R.drawable.ic_launcher);

Map<String, Object> mMap3=new HashMap<String, Object>();

mMap3.put("title", "我是第三个功能");

mMap3.put("icon", R.drawable.ic_launcher);

data.add(mMap1);

data.add(mMap2);

data.add(mMap3);

mListView.setAdapter(new SimpleAdapter(this, data, R.layout.list_item,

new String[]{"title","icon"}, new int[]{R.id.tv,R.id.iv}));

}

}

 

②activity_main.

<RelativeLayout 

    android:layout_width="match_parent"

    android:layout_height="match_parent">

 

    <ListView

        android:id="@+id/listview"

        android:layout_width="match_parent"

        android:layout_height="match_parent"/>

 

</RelativeLayout>

③list_item.

<LinearLayout 

    android:layout_width="match_parent"

    android:layout_height="match_parent">

 

<ImageView 

    android:id="@+id/iv"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"/>

<TextView 

    android:id="@+id/tv"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"/>

</LinearLayout>

 

3.自定义适配器:android界面中有时候需要显示稍微复杂的界面时,就需要我们自己定义一个adapter,那么就要继承BaseAdapter。