listView动态加载实例

来源:互联网 发布:大佬是什么梗网络 编辑:程序博客网 时间:2024/06/03 00:11
package com.dzl.Activity;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.widget.AbsListView;import android.widget.AdapterView;import android.widget.ListView;import android.widget.Toast;import android.widget.AbsListView.OnScrollListener;import com.dzl.adapter.PersonAdapter;import com.dzl.cn.R;import com.dzl.model.Person;import com.dzl.sqlite.DB_PersonService;public class MainActivity extends Activity implements OnScrollListener{/** Called when the activity is first created. */private static final String TAG = "DBActivity";private int visibleLastIndex = 0;DB_PersonService personService = new DB_PersonService(this);ListView listView ;static int index = 1 ;int pageSize = 16;boolean isLastRow = false;//判断是否到最后一行public static List<Person> persons = new ArrayList<Person>();PersonAdapter pseronAdapter;    private boolean mBusy = false; //标识是否存在滚屏操作 /*实现方法一 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); PersonService personService=new PersonService(this); ListView listView = (ListView) this.findViewById(R.id.listView); List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>(); // HashMap<String, String> title = new HashMap<String, String>(); // title.put("personid", "编号"); // title.put("name", "姓名"); // title.put("age", "年龄"); // data.add(title); List<Person> persons= personService.getScrollData(0, 10); for (Person person : persons) { HashMap<String, String> p = new HashMap<String, String>(); p.put("personid", String.valueOf(person.getId())); p.put("name", person.getName()); p.put("age",String.valueOf(person.getAge())); data.add(p); } // 适配器有: // ArrayAdapter<T> // simpAdapter // SimpleCursorAdapter SimpleAdapter adapter = new SimpleAdapter(DBActivity.this, data, R.layout.personitem, new String[] { "personid", "name", "age" }, new int[] {R.id.personid, R.id.name, R.id.age }); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override // parent即为你点击的listView // view为listview的外面布局 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListView listView= (ListView) parent; HashMap<String, String> itemdata= (HashMap<String, String>) listView.getItemAtPosition(position); String personid=itemdata.get("personid"); String name=itemdata.get("name"); String age=itemdata.get("age"); Log.i(TAG,view.getClass().getName()); Log.i(TAG, "personid: "+personid+ "   name: "+name+"   age:   "+age); Log.i(TAG," position==id:"+ (position==id));Toast.makeText(DBActivity.this, name, Toast.LENGTH_LONG).show(); } }); }*///实现方法二(游标)@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);listView = (ListView) this.findViewById(R.id.listView);/*for(int i=0;i<100;i++){Person person = new Person("张三",Short.valueOf(20+""));personService.save(person);}*///List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();// HashMap<String, String> title = new HashMap<String, String>();// title.put("personid", "编号");// title.put("name", "姓名");// title.put("age", "年龄");// data.add(title);// 适配器有:// ArrayAdapter<T>// simpAdapter// SimpleCursorAdapter/*SimpleCursorAdapter adapter = new SimpleCursorAdapter(MainActivity.this,R.layout.personitem, cursor, new String[] { "_id", "name", "age" },new int[] { R.id.personid, R.id.name, R.id.age });listView.setAdapter(adapter);*/persons = personService.getScrollData((index-1)*pageSize, index * pageSize);pseronAdapter = new PersonAdapter(MainActivity.this);listView.setAdapter(pseronAdapter);/*listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Override// parent即为你点击的listView// view为listview的外面布局public void onItemClick(AdapterView<?> parent, View view,int position, long id) {ListView listView = (ListView) parent;Cursor cursor = (Cursor) listView.getItemAtPosition(position);String personid = String.valueOf(cursor.getInt(0));String name = String.valueOf(cursor.getString(1));String age = String.valueOf(cursor.getShort(2));Log.i(TAG, view.getClass().getName());Log.i(TAG, "personid: " + personid + "   name: " + name+ "   age:   " + age);Log.i(TAG, " position==id:" + (position == id));Toast.makeText(MainActivity.this, name, Toast.LENGTH_LONG).show();}});*/listView.setOnScrollListener(MainActivity.this);//设置滚动监听事件}//firstVisibleItem  是当前页面可见的第一条item的position,visibleItemCount是当前页面可见的item数量,totalItemCount是listView的item数量@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {mBusy = false; if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {    //visibleLastIndex = firstVisibleItem + visibleItemCount;    isLastRow = true;    mBusy = true;     }}Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stub    index++;    List<Person> new_persons = personService.getScrollData(index * pageSize, pageSize);for(int i=0;i<new_persons.size();i++){persons.add(new_persons.get(i));}pseronAdapter.notifyDataSetChanged();}};Runnable runnable = new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubif(mBusy = true){Message msg = new Message();Bundle b = new Bundle();b.putString("arg1", "1");//b.putString("arg2", arg2);msg.setData(b);handler.sendMessage(msg);mBusy = false;}}};@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {System.out.println("--------------------------scrollState:"+scrollState);  //正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollState = 2的这次不回调 //回调顺序如下     //第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动     //第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下) //第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动//pseronAdapter.notifyDataSetChanged();//提醒adapter更新listView.setSelection(visibleLastIndex - 1);//设置listview的当前位置,如果不设置每次加载完后都会返回到list的第一项。    //当滚到最后一行且停止滚动时,执行加载if (isLastRow && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { //加载元素      isLastRow = false;   // Thread thread = new Thread(runnable);  //  thread.start();    index++;    List<Person> new_persons = personService.getScrollData(index * pageSize, pageSize);for(int i=0;i<new_persons.size();i++){persons.add(new_persons.get(i));}pseronAdapter.notifyDataSetChanged();}/*switch(scrollState){case OnScrollListener.SCROLL_STATE_IDLE: //Idle态,进行实际数据的加载显示  mBusy = false;  int first = view.getFirstVisiblePosition();          int count = view.getChildCount();          if(isLastRow)         {    Thread thread = new Thread(runnable);    thread.start();         }         break;case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:             mBusy = true;             break; case OnScrollListener.SCROLL_STATE_FLING:          mBusy = true;          break;       default:             break; }*/}}


 

package com.dzl.adapter;import java.util.ArrayList;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;import com.dzl.Activity.MainActivity;import com.dzl.cn.R;import com.dzl.model.Person;public class PersonAdapter extends BaseAdapter{private Context context;List<Person> persons = new ArrayList<Person>();public PersonAdapter(Context context) {super();this.context = context;this.persons = MainActivity.persons;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn persons.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn persons.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubthis.persons = MainActivity.persons;LayoutInflater mInflater = LayoutInflater.from(context);convertView = mInflater.inflate(R.layout.personitem, null);TextView id ;TextView name;TextView age;id = (TextView)convertView.findViewById(R.id.personid);name =  (TextView)convertView.findViewById(R.id.name);age = (TextView)convertView.findViewById(R.id.age);id.setText(persons.get(position).getId()+"");name.setText(persons.get(position).getName());age.setText(persons.get(position).getAge()+"");return convertView;}}


 

package com.dzl.model;public class Person {private Integer id;private String name;private Short age;public Person(String name, Short age) {this.name = name;this.age = age;}public Person(Integer id, String name, Short age) {super();this.id = id;this.name = name;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Short getAge() {return age;}public void setAge(Short age) {this.age = age;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}}


 

package com.dzl.sqlite;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.dzl.model.Person;public class DB_PersonService {private DBOpenHelper dbOpenHelper;// private Context context;public DB_PersonService(Context context) {// this.context = context;dbOpenHelper = new DBOpenHelper(context);}public void save(Person person) {SQLiteDatabase database = dbOpenHelper.getWritableDatabase();database.beginTransaction();database.execSQL("insert into person(name,age)values(?,?)",new Object[] { person.getName(), person.getAge()});// database.close();可以不关闭数据库,他里面会缓存一个数据库对象,如果以后还要用就直接用这个缓存的数据库对象。但通过// context.openOrCreateDatabase(arg0, arg1, arg2)打开的数据库必须得关闭database.setTransactionSuccessful();database.endTransaction();}public void update(Person person) {SQLiteDatabase database = dbOpenHelper.getWritableDatabase();database.execSQL("update person set name=?,age=? where personid=?",new Object[] { person.getName(), person.getAge(),person.getId() });database.close();}public Person find(Integer id) {SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.rawQuery("select * from person where personid=?",new String[] { String.valueOf(id) });if (cursor.moveToNext()) {return new Person(cursor.getInt(0), cursor.getString(1),cursor.getShort(2));}database.close();return null;}public void delete(Integer... ids) {if (ids.length > 0) {StringBuffer sb = new StringBuffer();for (Integer id : ids) {sb.append('?').append(',');}sb.deleteCharAt(sb.length() - 1);SQLiteDatabase database = dbOpenHelper.getWritableDatabase();database.execSQL("delete from person where personid in(" + sb.toString()+ ")", ids);database.close();}}public List<Person> getScrollData(int startResult, int maxResult) {List<Person> perons = new ArrayList<Person>();SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.rawQuery("select * from person limit ?,?",new String[] { String.valueOf(startResult),String.valueOf(maxResult) });while (cursor.moveToNext()) {perons.add(new Person(cursor.getInt(0), cursor.getString(1),cursor.getShort(2)));}cursor.close();database.close();return perons;}// 获取分页数据,提供给SimpleCursorAdapter使用。public Cursor getRawScrollData(int startResult, int maxResult) {List<Person> persons = new ArrayList<Person>();SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor rawQuery = database.rawQuery("select personid as _id ,name,age from person limit ?,?",new String[] { String.valueOf(startResult),String.valueOf(maxResult) });database.close();return rawQuery;}public long getCount() {SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.rawQuery("select count(*) from person", null);if (cursor.moveToNext()) {return cursor.getLong(0);}return 0;}}


 

package com.dzl.sqlite;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class DBOpenHelper extends SQLiteOpenHelper {// 类没有实例化,是不能用作父类构造器的参数,必须声明为静态private static String dbname = "zyj";private static int version = 1;public DBOpenHelper(Context context) {// 第一个参数是应用的上下文// 第二个参数是应用的数据库名字// 第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类// 第四个参数是数据库版本,必须是大于0的int(即非负数)super(context, dbname, null, version);// TODO Auto-generated constructor stub}public DBOpenHelper(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");}// onUpgrade()方法在数据库版本每次发生变化时都会把用户手机上的数据库表删除,然后再重新创建。// 一般在实际项目中是不能这样做的,正确的做法是在更新数据库表结构时,还要考虑用户存放于数据库中的数据不会丢失,从版本几更新到版本几。@Overridepublic void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {db.execSQL("DROP TABLE IF EXISTS person");onCreate(db);}}


 

package com.dzl.sqlite;import java.util.ArrayList;import java.util.List;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.dzl.model.Person;public class OtherPersonService {private DBOpenHelper dbOpenHelper;// private Context context;public OtherPersonService(Context context) {// this.context = context;dbOpenHelper = new DBOpenHelper(context);}public void save(Person person) {SQLiteDatabase database = dbOpenHelper.getWritableDatabase();ContentValues contentValues = new ContentValues();contentValues.put("name", person.getName());contentValues.put("age", person.getAge());database.insert("person", null, contentValues);}public void update(Person person) {SQLiteDatabase database = dbOpenHelper.getWritableDatabase();ContentValues contentValues = new ContentValues();contentValues.put("name", person.getName());contentValues.put("age", person.getAge());database.update("person", null, "personid=?",new String[] { String.valueOf(person.getId()) });}public Person find(Integer id) {SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.query("person", new String[] { "personid","name", "age" }, "personid=?",new String[] { String.valueOf(id) }, null, null, null);if (cursor.moveToNext()) {return new Person(cursor.getInt(0), cursor.getString(1),cursor.getShort(2));}return null;}public void delete(Integer... ids) {if (ids.length > 0) {StringBuffer sb = new StringBuffer();String[] strIds = new String[ids.length];// for (Integer id : ids) {// sb.append('?').append(',');// }for (int i = 0; i < strIds.length; i++) {sb.append('?').append(',');strIds[i] = String.valueOf(ids[i]);}sb.deleteCharAt(sb.length() - 1);SQLiteDatabase database = dbOpenHelper.getWritableDatabase();database.delete("person", "personid in(" + sb.toString() + ")",strIds);}}public List<Person> getScrollData(int startResult, int maxResult) {List<Person> persons = new ArrayList<Person>();SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.query("person", new String[] { "personid","name", "age" }, null, null, null, null, "personid desc",startResult + "," + maxResult);while (cursor.moveToNext()) {persons.add(new Person(cursor.getInt(0), cursor.getString(1),cursor.getShort(2)));}return persons;}public long getCount() {SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.query("person", new String[] { "count(*)" },null, null, null, null, null);if (cursor.moveToNext()) {return cursor.getLong(0);}return 0;}}


 

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    >    <RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="wrap_content">  <TextView  android:layout_width="40px"  android:layout_height="wrap_content"  android:textSize="20px"  android:id="@+id/personidtitle"  android:text="编号"  />   <TextView  android:layout_width="200px"  android:layout_height="wrap_content"   android:textSize="20px"  android:layout_toRightOf="@id/personidtitle"   android:layout_alignTop="@id/personidtitle"   android:gravity="center_horizontal"   android:id="@+id/nametitle"   android:text="姓名"  />   <TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"   android:textSize="20px"  android:layout_toRightOf="@id/nametitle"   android:layout_alignTop="@id/nametitle"   android:id="@+id/agetitle"   android:text="年龄"  /></RelativeLayout><ListView      android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:focusable="true"        android:focusableInTouchMode="true"    android:id="@+id/listView"    /></LinearLayout>


 

<?xml version="1.0" encoding="utf-8"?><RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="wrap_content">  <TextView  android:layout_width="40px"  android:layout_height="wrap_content"  android:textSize="20px"  android:id="@+id/personid"  />   <TextView  android:layout_width="200px"   android:layout_height="wrap_content"   android:textSize="20px"   android:layout_toRightOf="@id/personid"   android:layout_alignTop="@id/personid"   android:gravity="center_horizontal"   android:id="@+id/name"  />   <TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"   android:textSize="20px"  android:layout_toRightOf="@id/name"   android:layout_alignTop="@id/name"   android:id="@+id/age"  /></RelativeLayout>

原创粉丝点击