ScrollView:隻能用于控件比較少的界面,如果資料有上千上萬條,那麼使用ScrollView就不好了,因為ScrollView就把所有的控件進行初始化,這是非常消耗性能的操作,是以android就設計了一個類ListView來專門處理清單資料條目的顯示。
ListView:處理條目比較多,并且每個條目都非常相似的場景。就是一個條目控件,會自動回收沒有在螢幕上顯示的控件,來優化性能。
對于ListView和BaseAdapter
1簡單的用法
MainActivity.java
packagecom.example.listview;importandroid.os.Bundle;importandroid.app.Activity;importandroid.util.Log;importandroid.view.Menu;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.ListView;importandroid.widget.TextView;public class MainActivity extendsActivity {protected static final String TAG = "MainActivity";
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//找到ListView
ListView lv =(ListView) findViewById(R.id.lv);//給ListView設定資料(設定擴充卡 基本擴充卡)
lv.setAdapter(newBaseAdapter() {//加工ListView需要的條目 int position 條目的下标
@Overridepublic View getView(intposition, View convertView, ViewGroup parent) {
Log.i(TAG,"position:"+position);
TextView tv= new TextView(MainActivity.this);
tv.setText("人生自古誰沒有年輕的時候"+position);
tv.setTextSize(20);returntv;
}
@Overridepublic long getItemId(intposition) {return 0;
}
@Overridepublic Object getItem(intposition) {return null;
}//控制條目的數量
@Overridepublic intgetCount() {return 100;
}
});
}
}
activity_main.xml
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iYygjY5gDNjZjNkFDZiRWM4MmZmhTZzQGMzMTNhdTMi9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
上圖就是ListView控件的基本圖像
2複雜ListView的用法
首先要建立一個ListView和一個條目上的内容
activity_main.xml
item.xml
布局填充器layoutinflate:可以把res/layout下面的資源加載到記憶體,即可以把xml布局變成Java對象。一般就是加載item.xml上的東西
MainActivity.java
packagecom.example.listiview;importjava.util.ArrayList;importjava.util.List;importandroid.app.Activity;importandroid.content.Context;importandroid.os.Bundle;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.ListView;importandroid.widget.TextView;importcn.itcast.wh08.lv.domain.Teacher;public class MainActivity extendsActivity {
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv=(ListView) findViewById(R.id.lv);//模拟對象集合的資料 一般資料都是來自于網絡,或者資料庫
List data = new ArrayList();for(int i = 0;i<100;i++){
data.add(new Teacher(i, "隔壁老王"+i, i+20));
}//擴充卡
MyAdapter adapter = new MyAdapter(data, this);//設定擴充卡
lv.setAdapter(adapter);
}//擴充卡
private class MyAdapter extendsBaseAdapter{private Listdata;privateContext context;privateLayoutInflater mInflater;public MyAdapter(Listdata, Context context) {super();this.data =data;this.context =context;//擷取布局加載器
mInflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Overridepublic intgetCount() {returndata.size();
}//傳回條目指定位置的資料
@Overridepublic Object getItem(intposition) {returndata.get(position);
}
@Overridepublic long getItemId(intposition) {return 0;
}//加工條目
@Overridepublic View getView(intposition, View convertView, ViewGroup parent) {//使用布局加載器加載布局
View view = mInflater.inflate(R.layout.item, null);//找到條目對應的控件
TextView tv_name =(TextView) view.findViewById(R.id.tv_name);
TextView tv_age=(TextView) view.findViewById(R.id.tv_age);//擷取條目對應的資料
Teacher info =data.get(position);//把資料綁定給控件
tv_name.setText(info.name);
tv_age.setText(info.age+"");returnview;
}
}
}
Teacher.java
packagecom.example.listview.vo;public classTeacher {public int_id;publicString _name;public intage;public Teacher(int _id, String _name, intage) {super();this._id =_id;this._name =_name;this.age =age;
}publicTeacher() {super();
}
}
3.與資料庫結合來顯示
mode 資料模型(資料) :要被顯示到ListView上的資料集合
view 視圖(展示資料) : ListView
controller控制層(把資料展示到空間上) : 擴充卡Adapter
我們還是要先建立ListView控件和item控件
activity_main.xml
-
item.xml
先建立一個資料庫,為了得到資料。
MySqliteOpenHelper.java
packagecom.example.lisview.db;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteDatabase.CursorFactory;importandroid.database.sqlite.SQLiteOpenHelper;public class MySqliteOpenHelper extendsSQLiteOpenHelper {private staticSQLiteOpenHelper mInstance;public static synchronizedSQLiteOpenHelper getInstance(Context context) {if (mInstance == null) {
mInstance= new MySqliteOpenHelper(context, "itcast.db", null, 1);
}returnmInstance;
}publicMySqliteOpenHelper(Context context, String name,
CursorFactory factory,intversion) {super(context, name, factory, version);//TODO Auto-generated constructor stub
}
@Overridepublic voidonCreate(SQLiteDatabase db) {//設計一個表
db.execSQL("create table friends(_id integer primary key autoincrement,"
+ "name text," + "phone text)");//初始化表資料
ContentValues values = newContentValues();for (int i = 0; i < 100; i++) {
values.clear();
values.put("name", "老師" +i);
values.put("phone", "13787990" +i);
db.insert("friends", null, values);
}
}
@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion) {//TODO Auto-generated method stub
}
}
Friend.java
packagecom.example.lisview.vo;public classFriend {public int_id;publicString name;publicString phone;public Friend(int_id, String name, String phone) {super();this._id =_id;this.name =name;this.phone =phone;
}publicFriend() {//TODO Auto-generated constructor stub
}
}
對資料庫的增、删、查、改
FriendDao.java
packagecom.example.lisview.dao;importjava.util.ArrayList;importjava.util.List;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;importcom.example.lisview.db.MySqliteOpenHelper;importcom.example.lisview.vo.Friend;public classFriendDao {privateContext context;privateSQLiteOpenHelper helper;publicFriendDao(Context context) {this.context =context;
helper=MySqliteOpenHelper.getInstance(context);
}
public intqueryAllSize(){int size = 0;
SQLiteDatabase db=helper.getReadableDatabase();if(db.isOpen()){
Cursor cursor= db.query("friends", new String[]{"*"}, null, null, null, null, null);
size= cursor.getCount();//擷取Cursor的大小
cursor.close();
db.close();
}returnsize;
}
public List queryFriendsLimit(int startIndex, intblock) {
List infos = new ArrayList();
SQLiteDatabase db=helper.getReadableDatabase();if(db.isOpen()) {
Cursor cursor= db.query("friends", new String[] { "*" }, null,null, null, null, null, startIndex + "," +block);while(cursor.moveToNext()) {int _id = cursor.getInt(0);
String name= cursor.getString(1);
String phone= cursor.getString(2);
infos.add(newFriend(_id, name, phone));
}
cursor.close();
db.close();
}returninfos;
}
}
MyAdapter.java
packagecom.example.lisview.service;importjava.util.List;importandroid.content.Context;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.TextView;importcom.example.lisview.R;importcom.example.lisview.vo.Friend;public class MyAdapter extendsBaseAdapter {private Listinfos;privateLayoutInflater mInflater;public void setInfos(Listinfos) {this.infos =infos;
}public MyAdapter(Listinfos, Context context) {super();this.infos =infos;//布局加載器
mInflater =LayoutInflater.from(context);
}//傳回條目的總數
@Overridepublic intgetCount() {returninfos.size();
}//得到item.xml代表的對象
@Overridepublic Object getItem(intposition) {returninfos.get(position);
}//得到Item的id,不過在這裡貌似沒有用
@Overridepublic long getItemId(intposition) {returnposition;
}//得到Item的視圖
@Overridepublic View getView(intposition, View convertView, ViewGroup parent) {
View view= mInflater.inflate(R.layout.item, null);
TextView tv_name=(TextView) view.findViewById(R.id.tv_name);
TextView tv_phone=(TextView) view.findViewById(R.id.tv_phone);
Friend info=infos.get(position);
tv_name.setText(info.name);
tv_phone.setText(info.phone);returnview;
}
}
MainActivity.java
packagecom.example.lisview;importjava.util.List;importandroid.app.Activity;importandroid.app.AlertDialog;importandroid.content.DialogInterface;importandroid.content.Intent;importandroid.net.Uri;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.AdapterView;importandroid.widget.AdapterView.OnItemClickListener;importandroid.widget.Button;importandroid.widget.ListView;importcom.example.lisview.dao.FriendDao;importcom.example.lisview.service.MyAdapter;importcom.example.lisview.vo.Friend;public class MainActivity extendsActivity {privateListView lv;privateButton bt_pre;privateButton bt_next;privateFriendDao friendDao;private int block = 10;//每一頁擷取10條資料
private int startIndex = 0;//擷取資料的下标
privateMyAdapter adapter;private intsize;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}private voidinitView() {
lv=(ListView) findViewById(R.id.lv);
bt_pre=(Button) findViewById(R.id.bt_pre);
bt_next=(Button) findViewById(R.id.bt_next);
MyOnClickListener l= newMyOnClickListener();
bt_pre.setOnClickListener(l);
bt_next.setOnClickListener(l);
friendDao= new FriendDao(this);
size=friendDao.queryAllSize();//查詢第一頁資料
List infos = friendDao.queryFriendsLimit(0, block);
adapter= new MyAdapter(infos, this);
lv.setAdapter(adapter);//設定條目點選事件
lv.setOnItemClickListener(newMyOnItemClickListener());
}private class MyOnItemClickListener implementsOnItemClickListener {
@Overridepublic void onItemClick(AdapterView> parent, View view, intposition,longid) {//擷取條目的資料
final Friend info =(Friend) adapter.getItem(position);//彈出對話框
new AlertDialog.Builder(MainActivity.this)
.setTitle(info.name)
.setMessage("請選擇操作")
.setPositiveButton("打電話", newDialogInterface.OnClickListener() {
@Overridepublic void onClick(DialogInterface dialog, intwhich) {//打電話需要撥号權限
Intent intent = newIntent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+info.phone));
startActivity(intent);
}
})
.setNegativeButton("發短信", newDialogInterface.OnClickListener() {
@Overridepublic void onClick(DialogInterface dialog, intwhich) {//TODO:學員自己處理
}
})
.show();
}
}private class MyOnClickListener implementsOnClickListener {
@Overridepublic voidonClick(View v) {
List infos = null;switch(v.getId()) {caseR.id.bt_pre:
startIndex= startIndex -block;if (startIndex == 0) {
bt_pre.setEnabled(false);
}else{
bt_pre.setEnabled(true);
}
bt_next.setEnabled(true);
infos=friendDao.queryFriendsLimit(startIndex, block);
adapter.setInfos(infos);//把查詢的資料設定給擴充卡//重新整理界面
adapter.notifyDataSetChanged();break;caseR.id.bt_next:
startIndex= startIndex +block;//判斷是否是最後頁面的資料//現在頁面的資料 startIndex=startIndex+block
if ((startIndex + block) >=size) {//已經是最後一頁資料
bt_next.setEnabled(false);
}else{
bt_next.setEnabled(true);
}
bt_pre.setEnabled(true);
infos=friendDao.queryFriendsLimit(startIndex, block);
adapter.setInfos(infos);//把查詢的資料設定給擴充卡//重新整理界面
adapter.notifyDataSetChanged();break;default:break;
}
}
}
}