ListView#### MVC架構(gòu)
M: 模型層 --- 集合
V: 視圖層 --- ListView
C:控制層 --- Adapter
Adapter
- ListView的每一個(gè)條目都是一個(gè)View對(duì)象
BaseAdapter
public class MainActivity extends Activity {
List<Person> persons = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
persons = new ArrayList<Person>();
Person person;
for (int i = 0; i < 200; i++) {
String id = i + "";
String name = "張三" + i;
String phone = 158741 + i + "";
String salary = (16000 + i * 100) + "";
person = new Person(id, name, phone, salary);
persons.add(person);
}
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
}
class MyAdapter extends BaseAdapter {
// 系統(tǒng)調(diào)用,用來(lái)獲知集合中有多少個(gè)元素
@Override
public int getCount() {
return persons.size();
}
// 由系統(tǒng)調(diào)用,獲取一個(gè)View對(duì)象,作為listView的條目
// position: 本次getView方法調(diào)用所返回的View對(duì)象,在ListView中是處于第幾個(gè)條目,那么position的值就是多少
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 第一種方式
/*
* TextView tv = new TextView(MainActivity.this); Person person =
* persons.get(position); tv.setText(person.toString());
* tv.setTextSize(18); return tv;
*/
// 第二種方式
// 把布局文件填充為一個(gè)View對(duì)象
View v = View.inflate(MainActivity.this, R.layout.item_listview,
null);
/*LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
View v2 = inflater.inflate(R.layout.item_listview, null);
LayoutInflater inflater2 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View v3 = inflater2.inflate(R.layout.item_listview, null);*/
Person person = persons.get(position);
TextView tvName = (TextView) v.findViewById(R.id.tv_name);
tvName.setText(person.getName());
TextView tvPhone = (TextView) v.findViewById(R.id.tv_phone);
tvPhone.setText(person.getPhone());
TextView tvSalary = (TextView) v.findViewById(R.id.tv_salary);
tvSalary.setText("¥" + person.getSalary());
return v;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
}
listView優(yōu)化
public class MainActivity extends Activity {
List<Person> persons = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
persons = new ArrayList<Person>();
Person person;
for (int i = 0; i < 200; i++) {
String id = i + "";
String name = "張三" + i;
String phone = 158741 + i + "";
String salary = (16000 + i * 100) + "";
person = new Person(id, name, phone, salary);
persons.add(person);
}
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
}
class MyAdapter extends BaseAdapter {
// 系統(tǒng)調(diào)用,用來(lái)獲知集合中有多少個(gè)元素
@Override
public int getCount() {
return persons.size();
}
// 由系統(tǒng)調(diào)用,獲取一個(gè)View對(duì)象,作為listView的條目
// position: 本次getView方法調(diào)用所返回的View對(duì)象,在ListView中是處于第幾個(gè)條目,那么position的值就是多少
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 把布局文件填充為一個(gè)View對(duì)象
View v = null;
//判斷條目是否有緩存
if (convertView == null) {
v = View.inflate(MainActivity.this, R.layout.item_listview,
null);
} else {
v = convertView;
}
Person person = persons.get(position);
TextView tvName = (TextView) v.findViewById(R.id.tv_name);
tvName.setText(person.getName());
TextView tvPhone = (TextView) v.findViewById(R.id.tv_phone);
tvPhone.setText(person.getPhone());
TextView tvSalary = (TextView) v.findViewById(R.id.tv_salary);
tvSalary.setText("¥" + person.getSalary());
return v;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
}
填充View的三種方式
// 把布局文件填充為一個(gè)View對(duì)象
View v = View.inflate(MainActivity.this, R.layout.item_listview, null);
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
View v2 = inflater.inflate(R.layout.item_listview, null);
LayoutInflater inflater2 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View v3 = inflater2.inflate(R.layout.item_listview, null);
ArrayAdapter 只適合處理一個(gè)變量
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.lv);
String[] objects = new String[]{
"小志",
"大志",
"中志"
};
listView.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, R.id.tv_name, objects));
}
}
效果圖:
[圖片上傳中押蚤。泼掠。荣月。(1)]
SimpleAdapter 簡(jiǎn)單的適配器,比BaseAdapter簡(jiǎn)單,比ArrayAdapter復(fù)雜一些,可以處理多個(gè)變量
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.lv);
String[] objects = new String[] { "小志", "大志", "中志" };
//集合中每個(gè)元素都包含ListView條目需要的所有數(shù)據(jù),該案例中每個(gè)條目需要一個(gè)字符串和一個(gè)整型,所有使用一個(gè)map來(lái)封裝這兩種數(shù)據(jù)
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("photo", R.drawable.phone1);
map1.put("name", "小志");
data.add(map1);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("photo", R.drawable.phone2);
map2.put("name", "中志");
data.add(map2);
Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("photo", R.drawable.phone3);
map3.put("name", "大志");
data.add(map3);
listView.setAdapter(new SimpleAdapter(this, data, R.layout.item_listview, new String[]{
"photo", "name"
}, new int[]{
R.id.iv_photo, R.id.tv_name
}));
}
}