天天看點

java listview用法_對于ListView的一些用法(一)

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

java listview用法_對于ListView的一些用法(一)

上圖就是ListView控件的基本圖像

2複雜ListView的用法

首先要建立一個ListView和一個條目上的内容

activity_main.xml

item.xml

java listview用法_對于ListView的一些用法(一)

布局填充器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();

}

}

java listview用法_對于ListView的一些用法(一)

3.與資料庫結合來顯示

mode 資料模型(資料) :要被顯示到ListView上的資料集合

view 視圖(展示資料) : ListView

controller控制層(把資料展示到空間上) : 擴充卡Adapter

java listview用法_對于ListView的一些用法(一)

我們還是要先建立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;

}

}

}

}

java listview用法_對于ListView的一些用法(一)