ListView
- 就是用来显示一行一行的条目的
- MVC结构
- M:model模型层,要显示的数据 ————people集合
- V:view视图层,用户看到的界面 ————ListView
- c:control控制层,操作数据如何显示 ————adapter对象
- ListView的每一个条目都是一个View对象
BaseAdapter
-
必须实现的两个方法
-
第一个
//系统调用此方法,用来获知模型层有多少条数据 @Override public int getCount() { return people.size(); }
-
第二个
//系统调用此方法,获取要显示至ListView的View对象 //position:是return的View对象所对应的数据在集合中的位置 @Override public View getView(int position, View convertView, ViewGroup parent) { System.out.println("getView方法调用" + position); TextView tv = new TextView(MainActivity.this); //拿到集合中的元素 Person p = people.get(position); tv.setText(p.toString()); //把TextView的对象返回出去,它会变成ListView的条目 return tv; }
-
- 屏幕上能显示多少个条目,getView方法就会被调用多少次,屏幕向下滑动时,getView会继续被调用,创建更多的View对象显示至屏幕
条目的缓存
- 当条目划出屏幕时,系统会把该条目缓存至内存,当该条目再次进入屏幕,系统在重新调用getView时会把缓存的条目作为convertView参数传入,但是传入的条目不一定是之前被缓存的该条目,即系统有可能在调用getView方法获取第一个条目时,传入任意一个条目的缓存
案例代码
添加ListView布局
将023中的布局进行修改
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView>
</LinearLayout>
添加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" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名字"
android:textSize="25sp"
/>
<LinearLayout
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@+id/tv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="号码"
/>
<TextView
android:id="@+id/tv_salary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="工资"
/>
</LinearLayout>
</RelativeLayout>
展示数据
import java.util.ArrayList;
import java.util.List;
import com.exp.listviewshowdata.R;
import com.exp.showdata.domain.Person;
import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
List<Person> personList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
personList = new ArrayList<Person>();
//把数据库的数据查询出来
MyOpenHelper oh = new MyOpenHelper(this);
SQLiteDatabase db = oh.getWritableDatabase();
Cursor cursor = db.query("person", null, null, null, null, null, null, null);
while(cursor.moveToNext()){
String _id = cursor.getString(0);
String name = cursor.getString(1);
String salary = cursor.getString(2);
String phone = cursor.getString(3);
Person p = new Person(_id, name, phone, salary);
personList.add(p);
}
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
}
class MyAdapter extends BaseAdapter{
//系统调用,用来获知集合中有多少条元素
@Override
public int getCount() {
return personList.size();
}
//由系统调用,获取一个View对象,作为ListView的条目
//position:本次getView方法调用所返回的View对象,在listView中是处于第几个条目,那么position的值就是多少
//convertView: 是系统缓存起来的条目,如果有缓存则调用该对象,否则填充新的对象
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Person p = personList.get(position);
// TextView tv = new TextView(MainActivity.this);
System.out.println("getView调用:" + position + ";" + convertView);
// tv.setText(p.toString());
// tv.setTextSize(18);
View v = null;
//判断条目是否有缓存
if(convertView == null){
//把布局文件填充成一个View对象---第一种做法 把布局文件填充为View对象是一个比较耗费资源的操作 如果不做优化 多次拖动会崩掉
v = View.inflate(MainActivity.this, R.layout.item_listview, null);
}
else{
v = convertView;
}
//获取布局填充器对象---第二种做法
// 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);
//通过资源id查找组件,注意调用的是View对象的findViewById
TextView tv_name = (TextView) v.findViewById(R.id.tv_name);
tv_name.setText(p.getName());
TextView tv_phone = (TextView) v.findViewById(R.id.tv_phone);
tv_phone.setText(p.getPhone());
TextView tv_salary = (TextView) v.findViewById(R.id.tv_salary);
tv_salary.setText(p.getSalary());
return v;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
}