Android應用中使用ListView來分頁顯示重新整理的內容_Android

來源:互聯網
上載者:User

點擊按鈕重新整理
1、效果如下:

執行個體如下:  上圖的添加資料按鈕可以換成一個進度條  因為沒有資料所以我加了一個按鈕添加到資料庫用於測試;一般在伺服器拉去資料需要一定的時間,所以可以弄個進度條來提示使用者:
點擊載入按鈕的時候,向資料庫讀取一次資料,把讀取的資料追加到原來的資料集中;然後顯示出來

package com.exampleandroid.xiong.listviewpages;  public class News {  private String title;  private int id;   /**   *   * @return 返回新聞標題   */  public String getTitle() {   return title;  }   /**   *   * @param title   *   設定新聞標題   */  public void setTtitle(String title) {   this.title = title;  }   /**   *   * @return 返回新聞標識   */  public int getId() {   return id;  }   /**   *   * @param id   *   設定新聞標識   */  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   *   需要載入的頁數 每頁資料5條   * @param dbnews   *   SQLiteOpenHelper子類   * @return 返回新聞載入的資料   */  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條資料用於測試   *   * @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, "新聞標題" + i });    }    datas.setTransactionSuccessful();   } catch (Exception e) {    System.out.println("資料插入失敗!");    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);  }   // 建立資料庫表  @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載入的資料  private List<News> shownews;  private GetNews getnews;  private DbSqliteNews dbnews;  // 載入的頁數  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();   //此按鈕只為添加測試資料   adddata.setOnClickListener(new OnClickListener() {     @Override    public void onClick(View v) {     //插入資料     getnews.insertData(dbnews);     //擷取資料     shownews = getnews.getListNews(pagecount, dbnews);     //顯示資料     newShow_list.setAdapter(listadpter);    }   });   loadmore.setOnClickListener(new OnClickListener() {     @Override    public void onClick(View v) {     pagecount++;     //將資料追加到原集合     shownews.addAll(getnews.getListNews(pagecount, dbnews));     //重新整理資料     listadpter.notifyDataSetInvalidated();    }   });   // 第一次載入的資料   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="添加資料" />    <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> 

下拉重新整理
當ListView要顯示的資料過多時,為了更快的響應使用者,這個時候ListView進行分頁顯示再合適不過了。
ListView分頁顯示資料的原理其實很簡單,當使用者滑到ListView最後一項時,通知非同步線程進行載入下一頁的資料,下一頁資料載入完成時,調用設定好的Adapter的notifyDataSetChange()方法,ListView顯示下一頁的資料。
現在有兩個問題要解決,第一個問題要知道使用者是否滑到了ListView的最後一項;第二個問題是如何提示使用者正在載入下一頁的資料,讓使用者耐心等待。
解決第一個問題,我們只需自訂ListView,讓它實現OnScrollListener類監聽ListView的滑動狀態,以此來判斷是否滑動到了最後一項
這裡只簡單說一下要點:

@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){     // 使用者已經滑動到了ListView的最後一項   } 

要解決第二個問題也是在onScroll()方法中來實現

@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 );//用來提示使用者正在載入下一頁的資料     isLoading = true ;     listener.loadData();   } 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.