listview的使用
ListView :用来在界面上显示数据列表。
ListView 原理
Model Person
View ListView
Controle Adapter 数据适配器
1、在布局文件中添加一个listview控件
2、在代码中找到这个listview控件
3、创建一个数据适配器为listview填充数据
三种数据适配器
BaseAdapter
ListView lv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取ListView控件
lv = (ListView)findViewById(R.id.lv);
//设置适配器
lv.setAdapter(new MyListAdapter());
}
public class MyListAdapter extends BaseAdapter{
//返回要显示的总条目数量
public int getCount() {
// TODO Auto-generated method stub
return 600;
}
//返回该位置的条目对象
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
//返回该位置的条目id
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView tv = null;
if(null == convertView)//没有旧的条目可用则创建新的条目
{
tv = new TextView(MainActivity.this);
System.out.println("convertview null" + position);
}
else {//有旧的条目被隐藏则重新使用旧的条目显示数据
tv = (TextView) convertView;
System.out.println("复用旧的" + position);
}
tv.setText("test"+position);
tv.setTextSize(50);
return tv;
}
}
ArrayAdapter
使用ArrayAdapter为listview填充数据的步骤:1、在布局文件中添加ListView
2、在代码中得到这个listview控件
3、调用listview.setAdapter()填充数据
//使用适配器为listview填充数据
//new ArrayAdapter:context 上下文,resourceId 条目布局文件的资源ID,object[] 要显示的数据
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item, new String[]{"王菲","谢霆锋","张柏芝","李亚鹏"}));
SimpleAdapter
使用ArrayAdapter为listview填充数据的步骤:1、在布局文件中添加ListView
2、在代码中初始化这个listview控件
3、调用listview.setAdapter()填充数据
/**
* context 上下文
* data list 包含map
* resource item 布局文件
* from 就是我们map集合中存的key
* to item 布局中定义的控件的id
*
*/
List<Map<String, String>> data = new ArrayList<Map<String,String>>();
Map<String, String> map1 = new HashMap<String, String>();
map1.put("name", "张飞");
map1.put("phone", "138888");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("name", "赵云");
map2.put("phone", "110");
Map<String, String> map3 = new HashMap<String, String>();
map3.put("name", "曹操");
map3.put("phone", "1900");
Map<String, String> map4 = new HashMap<String, String>();
map4.put("name", "貂蝉");
map4.put("phone", "114");
// 把map存到 list集合
data.add(map1);
data.add(map2);
data.add(map3);
data.add(map4);
//设置listview的数据适配器
lv.setAdapter(new SimpleAdapter(getApplicationContext(), data, R.layout.item, new String[]{"name","phone"}, new int[]{R.id.tv_name,R.id.tv_phone}));
条目的布局文件:
<?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:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_id"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_name"
/>
</LinearLayout>
复杂ListView条目的显示
步骤:
1、在布局文件中添加ListView
2、在代码中初始化这个listview控件
lv = (ListView) findViewById(R.id.lv);
3、自定义数据适配器,继承了BaseAdapter,getView中我们不是简单的返回TextView,我们可以用布局文件来显示更复杂的条目
4、调用lv.setAdapter(new MyAdapter())填充数据
1、在布局文件中添加ListView
2、在代码中初始化这个listview控件
lv = (ListView) findViewById(R.id.lv);
3、自定义数据适配器,继承了BaseAdapter,getView中我们不是简单的返回TextView,我们可以用布局文件来显示更复杂的条目
4、调用lv.setAdapter(new MyAdapter())填充数据
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v;
if (null == convertView) {
//用布局填充器从条目布局文件获取ListView条目显示的View
v = View.inflate(MainActivity.this, R.layout.lv_item, null);
}
else {
v = convertView;
}
//从条目布局中获取相应的控件
ImageView iv = (ImageView) v.findViewById(R.id.ivicon);
iv.setImageResource(R.drawable.ic_launcher);
TextView lv1 = (TextView) v.findViewById(R.id.tvtitle);
lv1.setText("标题"+position);
TextView lv2 = (TextView) v.findViewById(R.id.tvcontent);
lv2.setText("内容"+position);
return v;
}
条目布局文件lv_item
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/ivicon"
android:layout_width="70dp"
android:layout_height="70dp" />
<TextView
android:id="@+id/tvtitle"
android:layout_toRightOf="@id/ivicon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tvcontent"
android:layout_marginTop="10dp"
android:layout_toRightOf="@id/ivicon"
android:layout_below="@id/tvtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</RelativeLayout>
//1种 写法 获取 布局填充器
//view = View.inflate(MainActivity.this, R.layout.item, null);
//2 种方法获取布局填充
//view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,null);
//3种写法 利用系统给我们提供的一个服务
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.item, null);