一、ListView的理解
1.什么ListView?
一种用来显示多个可滑动项(Item)列表的的ViewGroup
需要使用Adapter将集合数据和每一个Item所对应的布局动态适配到ListView中显示
显示列表: listView.setAdapter(adapter)
更新列表: adapter.notifyDataSetChanged()
二、实现ListView的三种常用方式
1、ArrayAdapter应用
ArrayAdapter(Context context,int resource,T[] objects)
ArrayAdapter(Context context,int resource,List<T> objects)
context:上下文对象,一般为Activity对象
resourcce:Item的布局文件标识
objects:需要显示的数据集合
2.案例
1.创建一个 layout xml文件
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
> </ListView>
2.创建 layout 文件 布局 ListView 子元素 items
<?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="50dp"
android:layout_marginLeft="20sp"
android:gravity="fill_vertical"
android:id="@+id/item_adapter" >
</TextView>
3. 代码实现
package com.example.android_ui_listview; import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView; public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_adapter); // 初始化控件
ListView adapter_lv = (ListView) findViewById(R.id.listView1);
// 1.准备集合数据
String[] strs = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "09",
"89", "77", "55", "ut", "sd", "gj", "gjk", "qw", "jhk" };
// 2.准备ArrayAdapter对象
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.adapter_item, strs);
// 3.设置Adapter显示列表
adapter_lv.setAdapter(adapter);
}
}
效果:
2、SimpleAdapter应用
SimpleAdapter(Context context,List<? entends Map<String,?>> data,int resource,String[] from,int[] to)
context:上下文对象,一般为Activity对象
data:需要显示的数据集合
resource:Item布局文件的标识
from:Map对象的Key的数组,用于得到对应的value
to:Item布局文件中的子View的id的数组
1).创建 layout
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
> </ListView>
2). item 布局
<?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="horizontal"
android:id="@+id/simple_adapter"> <ImageView
android:id="@+id/siple_iv"
android:layout_width="60dp"
android:layout_height="70dp"
android:src="@drawable/ic_launcher" /> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="69dp"
android:layout_marginRight="15dp"
android:gravity="center_vertical"
android:orientation="vertical"> <TextView
android:id="@+id/siple_tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/adapter_test" /> <TextView
android:id="@+id/siple_tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/adapter_number" />
</LinearLayout> </LinearLayout>
3)代码实现
package com.example.android_ui_listview; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter; public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_adapter);
// 初始化控件ListView
ListView listView = (ListView) findViewById(R.id.listView1) ; //1.准备数据
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>() ;
for(int i=0;i<10;i++){
Map<String,Object> map = new HashMap<String,Object>() ;
// key对应的from数组
map.put("siple_iv", R.drawable.ic_launcher) ;
map.put("siple_tv1", "价格:"+(i*3+0.1)) ;
map.put("siple_tv2", i+100) ;
list.add(map) ;
} //2.准备SimpleAdapter对象
// 准白
String[] from = { "siple_iv", "siple_tv1", "siple_tv2" };
// 对应 Item 子样式 里面控件的id
int[] to = { R.id.siple_iv, R.id.siple_tv1,R.id.siple_tv2} ;
SimpleAdapter simpleAdapter = new SimpleAdapter(this, list,R.layout.siple_adapter, from, to) ; //3.添加到listView里面
listView.setAdapter(simpleAdapter) ;
}
}
4).
3、BaseAdapter(抽象类)应用
public view getView(int position,View converView,ViewGroup parent)
返回指定下标所对应的item的View对象
position:下标
converView:可复用的缓存Item视图对象,前n+1个为null
parent:ListView对象
1.layout xml配置
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
> </ListView>
2.ListView子元素 item 布局
<?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="horizontal"
android:id="@+id/simple_adapter"> <ImageView
android:id="@+id/siple_iv"
android:layout_width="60dp"
android:layout_height="70dp"
android:src="@drawable/ic_launcher" /> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="69dp"
android:layout_marginRight="15dp"
android:gravity="center_vertical"
android:orientation="vertical"> <TextView
android:id="@+id/siple_tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/adapter_test" /> <TextView
android:id="@+id/siple_tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/adapter_number" />
</LinearLayout> </LinearLayout>
3.创建一个简单实体类
package com.example.android_ui_listview; public class ShopInfo {
private int image ; //图片
private String sname ; //名称
private String price ; //价格 public ShopInfo() {
super();
}
public ShopInfo(int image, String sname, String price) {
super();
this.image = image;
this.sname = sname;
this.price = price;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
4.activity实现
package com.example.android_ui_listview; import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity {
List<ShopInfo> list ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_adapter); // 初始化 ListView
ListView listView = (ListView) findViewById(R.id.listView1) ; // 1.准备数据
list = new ArrayList<ShopInfo>() ;
for(int i=0;i<100;i++){
ShopInfo s = new ShopInfo(R.drawable.ic_launcher,"名称:Android"+(i+1)+"号","价格:"+(i*12)+"$") ;
list.add(s) ;
} // 2.准备BaseAdapter对象
MyBaseAdapter baseAdapter = new MyBaseAdapter() ; // 3.添加listView里面
listView.setAdapter(baseAdapter) ;
} class MyBaseAdapter extends BaseAdapter{
// 返回集合数据的数量
@Override
public int getCount() {
return list.size();
}
//返回指定下标对应的数据对象
@Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
/**
*
* 返回指定下标对应的item的view对象
* position:下标
* convertview:可重复利用的控件
* parent:ListView对象
* */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//加载item的布局,得到View对象
if(convertView == null){ //如果直接创建,很有可能照成应用崩毁
convertView = View.inflate(MainActivity.this, R.layout.siple_adapter, null) ;
}
//根据position设置对应的数据
//得到当前行的数据对象
ShopInfo s = list.get(position) ;
//得到子view对象
ImageView imageView = (ImageView) convertView.findViewById(R.id.siple_iv) ;
TextView tv1 = (TextView) convertView.findViewById(R.id.siple_tv1) ;
TextView tv2 = (TextView) convertView.findViewById(R.id.siple_tv2) ;
// 设置资源
imageView.setImageResource(s.getImage()) ;
tv1.setText(s.getSname()) ;
tv2.setText(s.getPrice()) ; return convertView;
} }
}
实现效果
总结: SimpleAdapter 和 BaseAdapter 很类似
SimpleAdapter是把数据存放在Map中,根据from 和to 对应的
BaseAdapter是把数据存放到自己定义的Pojo中 在根据继承BaseAdapter 实现里面的抽象方法