Android應(yīng)用中使用ListView來(lái)分頁(yè)顯示刷新的內(nèi)容
點(diǎn)擊按鈕刷新
1、效果如下:
實(shí)例如下: 上圖的添加數(shù)據(jù)按鈕可以換成一個(gè)進(jìn)度條 因?yàn)闆](méi)有數(shù)據(jù)所以我加了一個(gè)按鈕添加到數(shù)據(jù)庫(kù)用于測(cè)試;一般在服務(wù)器拉去數(shù)據(jù)需要一定的時(shí)間,所以可以弄個(gè)進(jìn)度條來(lái)提示用戶:
點(diǎn)擊加載按鈕的時(shí)候,向數(shù)據(jù)庫(kù)讀取一次數(shù)據(jù),把讀取的數(shù)據(jù)追加到原來(lái)的數(shù)據(jù)集中;然后顯示出來(lái)
package com.exampleandroid.xiong.listviewpages; public class News { private String title; private int id; /** * * @return 返回新聞標(biāo)題 */ public String getTitle() { return title; } /** * * @param title * 設(shè)置新聞標(biāo)題 */ public void setTtitle(String title) { this.title = title; } /** * * @return 返回新聞標(biāo)識(shí) */ public int getId() { return id; } /** * * @param id * 設(shè)置新聞標(biāo)識(shí) */ public void setId(int id) { this.id = id; } }
package com.exampleandroid.xiong.listviewpages; import java.util.ArrayList; import java.util.List; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class GetNews { /** * * @param page * 需要加載的頁(yè)數(shù) 每頁(yè)數(shù)據(jù)5條 * @param dbnews * SQLiteOpenHelper子類 * @return 返回新聞加載的數(shù)據(jù) */ public List<News> getListNews(int page, DbSqliteNews dbnews) { List<News> list = new ArrayList<News>(); String sql = "select * from tb_newstile where news_id not in(select news_id from tb_newstile LIMIT " + 5 * (page - 1) + ") LIMIT " + 5 * page; Cursor cursor = dbnews.getReadableDatabase().rawQuery(sql, null); while (cursor.moveToNext()) { News news = new News(); news.setTtitle(cursor.getString(1)); news.setId(cursor.getInt(0)); list.add(news); } cursor.close(); return list; } /** * 插入100條數(shù)據(jù)用于測(cè)試 * * @param dbnews * SQLiteOpenHelper子類 */ public void insertData(DbSqliteNews dbnews) { SQLiteDatabase datas = dbnews.getWritableDatabase(); datas.beginTransaction(); try { for (int i = 0; i < 100; i++) { datas.execSQL("insert into tb_newstile values(?,?)", new Object[] { i, "新聞標(biāo)題" + i }); } datas.setTransactionSuccessful(); } catch (Exception e) { System.out.println("數(shù)據(jù)插入失?。?); e.printStackTrace(); } finally { datas.endTransaction(); } } }
package com.exampleandroid.xiong.listviewpages; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DbSqliteNews extends SQLiteOpenHelper { public DbSqliteNews(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } // 創(chuàng)建數(shù)據(jù)庫(kù)表 @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table tb_newstile(news_id integer ,news_title varchar(100))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
package com.exampleandroid.xiong.listviewpages; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { private ListView newShow_list; private Button loadmore, adddata; // ListView加載的數(shù)據(jù) private List<News> shownews; private GetNews getnews; private DbSqliteNews dbnews; // 加載的頁(yè)數(shù) private int pagecount = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); newShow_list = (ListView) findViewById(R.id.newsShow_list); loadmore = (Button) findViewById(R.id.loadmore_bt); adddata = (Button) findViewById(R.id.adddata); dbnews = new DbSqliteNews(this, "new.db", null, 1); getnews = new GetNews(); final ListAdpaterNews listadpter=new ListAdpaterNews(); //此按鈕只為添加測(cè)試數(shù)據(jù) adddata.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //插入數(shù)據(jù) getnews.insertData(dbnews); //獲取數(shù)據(jù) shownews = getnews.getListNews(pagecount, dbnews); //顯示數(shù)據(jù) newShow_list.setAdapter(listadpter); } }); loadmore.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { pagecount++; //將數(shù)據(jù)追加到原集合 shownews.addAll(getnews.getListNews(pagecount, dbnews)); //刷新數(shù)據(jù) listadpter.notifyDataSetInvalidated(); } }); // 第一次加載的數(shù)據(jù) shownews = getnews.getListNews(pagecount, dbnews); newShow_list.setAdapter(listadpter); } class ListAdpaterNews extends BaseAdapter { @Override public int getCount() { return pagecount * 5; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = LayoutInflater.from(MainActivity.this).inflate( R.layout.news_title, null); TextView txttitle = (TextView) view.findViewById(R.id.txt_title); ImageView images = (ImageView) view .findViewById(R.id.showimage_title); images.setBackgroundResource(R.drawable.n_me_l); txttitle.setText(shownews.get(position).getTitle()); return view; } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <ListView android:id="@+id/newsShow_list" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" > <Button android:id="@+id/adddata" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="添加數(shù)據(jù)" /> <Button android:id="@+id/loadmore_bt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/loadmore" /> </LinearLayout> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="15dp" android:orientation="horizontal" > <ImageView android:id="@+id/showimage_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/n_me_l" android:contentDescription="@string/imagenews" /> <TextView android:id="@+id/txt_title" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
下拉刷新
當(dāng)ListView要顯示的數(shù)據(jù)過(guò)多時(shí),為了更快的響應(yīng)用戶,這個(gè)時(shí)候ListView進(jìn)行分頁(yè)顯示再合適不過(guò)了。
ListView分頁(yè)顯示數(shù)據(jù)的原理其實(shí)很簡(jiǎn)單,當(dāng)用戶滑到ListView最后一項(xiàng)時(shí),通知異步線程進(jìn)行加載下一頁(yè)的數(shù)據(jù),下一頁(yè)數(shù)據(jù)加載完成時(shí),調(diào)用設(shè)置好的Adapter的notifyDataSetChange()方法,ListView顯示下一頁(yè)的數(shù)據(jù)。
現(xiàn)在有兩個(gè)問(wèn)題要解決,第一個(gè)問(wèn)題要知道用戶是否滑到了ListView的最后一項(xiàng);第二個(gè)問(wèn)題是如何提示用戶正在加載下一頁(yè)的數(shù)據(jù),讓用戶耐心等待。
解決第一個(gè)問(wèn)題,我們只需自定義ListView,讓它實(shí)現(xiàn)OnScrollListener類監(jiān)聽ListView的滑動(dòng)狀態(tài),以此來(lái)判斷是否滑動(dòng)到了最后一項(xiàng)
這里只簡(jiǎn)單說(shuō)一下要點(diǎn):
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount ) { if (getAdapter() == null){ return ; } if (getAdapter().getCount() == 0){ return ; } int lastItemIndex = firstVisibleItem + visibleItemCount; if (lastItemIndex >= totalItemCount){ // 用戶已經(jīng)滑動(dòng)到了ListView的最后一項(xiàng) }
要解決第二個(gè)問(wèn)題也是在onScroll()方法中來(lái)實(shí)現(xiàn)
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (getAdapter() == null){ return ; } if (getAdapter().getCount() == 0){ return ; } int lastItemIndex = firstVisibleItem + visibleItemCount; if (lastItemIndex >= totalItemCount && ! isLoading){ addFooterView( footerView );//用來(lái)提示用戶正在加載下一頁(yè)的數(shù)據(jù) isLoading = true ; listener.loadData(); }
- Android程序開發(fā)之Listview下拉刷新上拉(滑動(dòng)分頁(yè))加載更多
- Android實(shí)現(xiàn)listview動(dòng)態(tài)加載數(shù)據(jù)分頁(yè)的兩種方法
- Android ListView分頁(yè)功能實(shí)現(xiàn)方法
- Android應(yīng)用中ListView利用OnScrollListener分頁(yè)加載數(shù)據(jù)
- Android操作SQLite數(shù)據(jù)庫(kù)(增、刪、改、查、分頁(yè)等)及ListView顯示數(shù)據(jù)的方法詳解
- Android中ListView如何分頁(yè)加載數(shù)據(jù)
- Android實(shí)現(xiàn)ListView分頁(yè)自動(dòng)加載數(shù)據(jù)的方法
- android實(shí)現(xiàn)listview分頁(yè)的方法
- android listview優(yōu)化幾種寫法詳細(xì)介紹
- Android之ListView分頁(yè)加載數(shù)據(jù)功能實(shí)現(xiàn)代碼
相關(guān)文章
Android獲取和讀取短信驗(yàn)證碼的實(shí)現(xiàn)方法
這篇文章主要介紹了Android獲取和讀取短信驗(yàn)證碼的實(shí)現(xiàn)方法,文章內(nèi)容介紹了如何讀取剛收到的短信的相關(guān)內(nèi)容,以及Android獲取短信驗(yàn)證碼的方法,感興趣的小伙伴們可以參考一下2016-03-03Android自定義View實(shí)現(xiàn)圓形進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)圓形進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06RecylerView實(shí)現(xiàn)流布局StaggeredGridLayoutManager使用詳解
這篇文章主要為大家詳細(xì)介紹了RecylerView實(shí)現(xiàn)流布局StaggeredGridLayoutManager使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09android Retrofit2網(wǎng)絡(luò)請(qǐng)求封裝介紹
大家好,本篇文章主要講的是android Retrofit2網(wǎng)絡(luò)請(qǐng)求封裝介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Android開機(jī)自啟動(dòng)服務(wù)的實(shí)現(xiàn)方法
Android開機(jī)自啟動(dòng)服務(wù)的實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-05-05Android頂部工具欄和底部工具欄的簡(jiǎn)單實(shí)現(xiàn)代碼
Android頂部工具欄和底部工具欄的簡(jiǎn)單實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-05-05Android 實(shí)現(xiàn)IOS 滾輪選擇控件的實(shí)例(源碼下載)
這篇文章主要介紹了 Android 實(shí)現(xiàn)IOS 滾輪選擇控件的實(shí)例(源碼下載)的相關(guān)資料,需要的朋友可以參考下2017-03-03搭建mac使用Charles抓包安卓app環(huán)境配置過(guò)程
這篇文章主要為大家介紹了mac使用Charles抓包,安卓app環(huán)境搭建的配置過(guò)程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02