ListView 需要适配器 Adapter 将数据和视图结合在一起。常用的adapter有以下三种:
ArrayAdapter:
第一步:声明一个 ListView 属性,并声明一个属性用来存放数据。
private ListView mListView;
private List<String> data;
第二步:初始化 ListView。
mListView = new ListView(this);
第三步:给 ListView 绑定过适配器
参数1:是传递一个上下文对象
参数2:是系统提供的一种简单的的布局文件
参数3:是你要用ArrayList来显示的数据是什么
参数2:是系统提供的一种简单的的布局文件
参数3:是你要用ArrayList来显示的数据是什么
mListView.setAdapter(new ArrayAdapter<String> (this,android.R.layout.simple_expandable_list_item_1,getData()));
还需要写getData 方法:
private List<String> getData(){
data = null;
//如果一个方法可能会被多次调用,而这个方法中又存在对类成员变量的初始化赋值,
// 在初始化之前,先将其置空
data = new ArrayList<String>();
data.add("张飞");
data.add("带上开发");
data.add("好好学");
data.add("就不写");
return data;
data = null;
//如果一个方法可能会被多次调用,而这个方法中又存在对类成员变量的初始化赋值,
// 在初始化之前,先将其置空
data = new ArrayList<String>();
data.add("张飞");
data.add("带上开发");
data.add("好好学");
data.add("就不写");
return data;
第四步:
将ListView添加到Activity 上
setContentView(mListView)
SimpleAdapter:
第一步:创建一个布局文件,给每一个 Item 进行布局。
第二步:在 mainactivity 的布局文件中添加 listview 。
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
第三步:声明属性并进行初始化。
private ListView mListView;
mListView = (ListView) findViewById(R.id.listView);
第四步:创建一个 simpleAdapter 适配器。
参数1:是传递的一个上下文对象
参数2 :要显示的数据
参数3: 数据显示的布局文件
参数4:数据提取时用到的键
参数5:数据对应的布局文件中的控件ID
参数2 :要显示的数据
参数3: 数据显示的布局文件
参数4:数据提取时用到的键
参数5:数据对应的布局文件中的控件ID
SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.list_item_layout,
new String[]{"image", "title", "info"},
new String[]{"image", "title", "info"},
new int[]{R.id.image, R.id.title, R.id.info});
写getData方法:
private List<Map<String, Object>> getData() {
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
map.put("image", R.drawable.a4);
map.put("title", "在水源");
map.put("info", "之后束带结发");
list.add(map);
Map<String, Object> map1 = new HashMap<>();
map1.put("image", R.drawable.a5);
map1.put("title", "刻舟记");
map1.put("info", "麻雀孙晓");
list.add(map1);
Map<String, Object> map2 = new HashMap<>();
map2.put("image", R.drawable.a6);
map2.put("title", "滕王阁序");
map2.put("info", "秋水共长天一色");
list.add(map2);
return list;
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
map.put("image", R.drawable.a4);
map.put("title", "在水源");
map.put("info", "之后束带结发");
list.add(map);
Map<String, Object> map1 = new HashMap<>();
map1.put("image", R.drawable.a5);
map1.put("title", "刻舟记");
map1.put("info", "麻雀孙晓");
list.add(map1);
Map<String, Object> map2 = new HashMap<>();
map2.put("image", R.drawable.a6);
map2.put("title", "滕王阁序");
map2.put("info", "秋水共长天一色");
list.add(map2);
return list;
}
第五步:将 adapter 和listView 进行绑定。
mListView.setAdapter(adapter);
BaseAdapter:
第一步:创建一个布局文件对每一个Item进行布局。
第二步:在 mainActivity 中添加 ListView 控件。
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello World!" />
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello World!" />
第三步:声明属性并进行初始化。
private ListView mLsitView;
mLsitView = (ListView) findViewById(R.id.listView);
mLsitView = (ListView) findViewById(R.id.listView);
第四步:创建一类(MyAdapter),继承自 BaseAdapter。
(
通时要建一个 News 类 和 viewHolder 类 方法的抽取
)
1. 实体类 news:
public class News {
//存放图片, 资源都是采用Id 的形式存储
private int img;
private String title;
private String info;
//初始化方法
public News (int img, String title, String info){
this.img = img;
this.title = title;
this.info = info;
}
public int getImg() {
return img;
}
public void setImg(int img) {
this.img = img;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
//存放图片, 资源都是采用Id 的形式存储
private int img;
private String title;
private String info;
//初始化方法
public News (int img, String title, String info){
this.img = img;
this.title = title;
this.info = info;
}
public int getImg() {
return img;
}
public void setImg(int img) {
this.img = img;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
2.
Viewholder 类:
public class ViewHolder {
//这里罗列的是所有的控件
public ImageView imageView;
public TextView titleView;
public TextView infoView;
}
//这里罗列的是所有的控件
public ImageView imageView;
public TextView titleView;
public TextView infoView;
}
3. MyAdapter:
继承自 BaseAdapter
里面有以下方法:
public int getCount() {
return list.size();
}
public Object getItem(int position)
{
return list.get(position);
}
public long getItemId(int position) {
return position;
}
@Override
//获取 position 对应位置的视图
public View getView(int position, View view, ViewGroup parent) {
/**
* 优化前的方式
*
//去获取指定的Layout 文件中间指定的id 的控件
//获取 position 对应位置的视图
public View getView(int position, View view, ViewGroup parent) {
/**
* 优化前的方式
*
//去获取指定的Layout 文件中间指定的id 的控件
View v = LayoutInflater.from(context).inflate(R.layout.item_layout,null);
ImageView imageView= (ImageView) v.findViewById(R.id.image)
TextView titleView = (TextView) v.findViewById(R.id.text1);
TextView infoView = (TextView) v.findViewById(R.id.text2);
//拿到我们的数据
News news = (News) getItem(position);
//根据数据对界面进行赋值
imageView.setBackgroundResource(news.getImg());
titleView.setText(news.getTitle().toString());
infoView.setText(news.getInfo().toString());
return v;
*/
TextView infoView = (TextView) v.findViewById(R.id.text2);
//拿到我们的数据
News news = (News) getItem(position);
//根据数据对界面进行赋值
imageView.setBackgroundResource(news.getImg());
titleView.setText(news.getTitle().toString());
infoView.setText(news.getInfo().toString());
return v;
*/
第二种优化:
第三种优化方式:
//优化后的方式 // 利用缓存 ViewHolder holder = new ViewHolder(); News news = (News) getItem(position); if(view == null) { //将指定的布局文件转化成视图对象 //这里是缓存的界面控件 view = View.inflate(context, R.layout.item_layout, null); // holder = new ViewHolder(); holder.imageView = (ImageView) view.findViewById(R.id.image); holder.titleView = (TextView) view.findViewById(R.id.text1); holder.infoView = (TextView) view.findViewById(R.id.text2); view.setTag(holder); news = (News) getItem(position); holder.imageView.setBackgroundResource(news.getImg()); holder.titleView.setText(news.getTitle().toString()); holder.infoView.setText(news.getInfo().toString()); }else { holder = (ViewHolder) view.getTag(); } return view; }
第五步:创建Adapter 并进行绑定:
MyAdapter adapter = new MyAdapter(this,getData()); mLsitView.setAdapter(adapter);
写 getData 方法赋值:
private List<News> getData(){ List<News> list =new ArrayList<>(); News new1 = new News(R.drawable.c,"美女","rijhfio"); list.add(new1); News new2 = new News(R.drawable.a4,"DSDFS","DFS"); list.add(new2); News new3 = new News(R.drawable.b,"SFSDF","SDDFSD"); list.add(new3); News new4 = new News(R.drawable.b,"SFSDF","SDDFSD"); list.add(new4); News new5 = new News(R.drawable.b,"SFSDF","SDDFSD"); list.add(new5); News new6= new News(R.drawable.c,"美女","rijhfio"); list.add(new6);