通常我们在用Listview类时候,Android自带的相关类都不够用,我当初在理解系统自带的简单格式例子的时候都很头痛,我把他们之间的关系做个比喻,好理解多了。
假如我们要做一个联系人的列表
以列表形式显示一系列数据需要用到ListView类,而用列表(LisetView)就需要:
- 原始数据————一堆电话号码、姓名、邮箱
- 原始数据分组————一个联系人信息包括:电话、姓名、邮箱
- 设定数据的显示格式————电话号码跟在姓名后面,邮箱在第二行
- 将数据组排列————作为list的其中一项(item)——一个item就是一个联系人
- 设定一个适配器(Adapter)————将联系人以某种格式显示在listview里面——适配器可以设定数据的显示格式
那么如何将他们组合到一起,运行在手机里?
我将ListView类比作『饼干盒』。
饼干原料(原始数据)混合发酵成面团(设定数据显示格式),用饼干模具压出小熊形状(分组),烘烤成香喷喷的小熊饼干。但是想要送人的时候显得高大上,还要装在『饼干盒』里,不能随便装,要把烤好的饼干一个个码好,送情人就码出心型
那盒子一歪,心型不就没了么?
对的,所以用一个塑料托盘(适配器)来装,托盘里已经挖好了心型的洞,把一个个洞填上饼干,在把托盘装进饼干盒,就可以送人啦!
所以你看,最后饼干的样子和口味取决于你的原料、和面方式、模具形状和托盘的选择。
看起来好复杂,做饼干也好困难
新手嘛?没关系,android已经写好了一份关于饼干的设备、原料比例、制作流程的说明书,虽然只能做出一个样子口味,但好歹你也会做饼干了
那开头的那个联系人的例子怎么实现?
上面说做个联系人饼干,那么我们就把各个联系人以Arraylist方式串成一字长蛇吧。
新建一个『联系人信息类』:联系人的号码、邮箱、姓名以『联系人格式』串在一起,『联系人格式』是我自定义的,就是告诉系统我这『联系人格式』里有号码、电话、邮箱。
联系人信息放在上图特定的坑里,这一步可以在适配器里完成。坑是在layout.xml里挖出来的
最后把用list.setAdapter(adapter )方法,最终显示在手机屏幕上
这么简单的联系人信息还要我告诉系统怎么排列,这样的简单格式系统不是知道怎么做么?
我只是举个例子,其实联系的人信息可以有很多呢,用自带的格式就不合适了。
那么到底如何写代码?
写代码好烦。。。
MainActivity.java
package com.example.text;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.widget.ListView;
public class MainActivity extends Activity {
ListView list;
List<PersonInfo> personInfo;
PersonInfo pi;
MyAdapter ma;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.listView1);
personInfo = new ArrayList<PersonInfo>();
pi = new PersonInfo();
//假定有了数据库
Cursor cur = null;
while (cur.moveToNext()) {
String name = cur.getString(cur.getColumnIndex("name"));
pi.setName(name);
String phone = cur.getString(cur.getColumnIndex("phone"));
pi.setPhone(phone);
String email = cur.getString(cur.getColumnIndex("eamil"));
pi.setEmail(email);
personInfo.add(pi);
}
cur.close();
ma = new MyAdapter(this, personInfo);
list.setAdapter(ma);
}
}
</pre><pre code_snippet_id="364335" snippet_file_name="blog_20140526_4_7049371" name="code" class="java">
MyAdapter.java
package com.example.text;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter {
private Context context;
private List<PersonInfo> pi;
public MyAdapter(Context context,List<PersonInfo> pi) {
super();
this.context = context;//拿到包含MainActivity的context
this.pi = pi;//拿到包含<personInfo>的列表的引用类型
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 0;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 在这里把拿到到的<PersonInfo>格式的列表数据以row.xml的方式排列在activity_main.xml
//拿到布局文件。在row.xml定义了一个id,这里就能找到R.layout.row
//这里不能用setContentView(R.layout.activity_main)拿到布局
convertView = LayoutInflater.from(context).inflate(R.layout.row,null);
//拿到控件
TextView name = (TextView) convertView.findViewById(R.id.tv_name);
TextView phone = (TextView) convertView.findViewById(R.id.tv_phone);
TextView email = (TextView) convertView.findViewById(R.id.tv_email);
//设置控件内容
name.setText(pi.get(position).getName());
phone.setText(pi.get(position).getPhone());
email.setText(pi.get(position).getEmail());
return null;
}
}
PersonInfo.java
package com.example.text;
public class PersonInfo {
private String name;
private String phone;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
最后是手写的草稿