Android實現ListView分頁自動載入資料的方法_Android

來源:互聯網
上載者:User

Android應用開發中,採用ListView組件來展示資料是很常用的功能,當一個應用要展現很多的資料時,一般情況下都不會把所有的資料一次就展示出來,而是通過分頁的形式來展示資料,個人覺得這樣會有更好的使用者體驗。因此,很多應用都是採用分批次載入的形式來擷取使用者所需的資料。例如:微部落格戶端可能會在使用者滑動至列表底端時自動載入下一頁資料,也可能在底部放置一個"查看更多"按鈕,使用者點擊後,載入下一頁資料。
下面通過一個Demo來展示ListView功能如何?:該Demo通過在ListView列表的底部添加一個“查看更多...”按鈕來載入新聞(類比新聞用戶端)分頁資料。同時限定每次載入10條記錄,但完全載入完資料後,就把ListView列表底部視圖“查看更多...”刪除。假設載入的資料總數為 38 條記錄。先看下該Demo工程的程式結構圖:

其中包 com.andyidea.bean中News.java類是新聞實體類,包com.andyidea.listview中paginationListViewActivity.java類是用來展示ListView列表。布局layout中包含三個布局檔案,分別為:list_item.xml , loadmore.xml , main.xml 。下面分別貼下源碼:
layout中的 list_item.xml源碼:

<span style="font-size:13px;"><?xml version="1.0" encoding="utf-8"?> <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:orientation="vertical">  <TextView    android:id="@+id/newstitle"    android:layout_width="fill_parent"    android:layout_height="wrap_content"/>  <TextView    android:id="@+id/newscontent"    android:layout_width="fill_parent"    android:layout_height="wrap_content"/> </LinearLayout></span> 

layout中loadmore.xml源碼:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent">  <Button     android:id="@+id/loadMoreButton"     android:layout_width="fill_parent"     android:layout_height="wrap_content"    android:text="查看更多..." />  </LinearLayout> 

layout中main.xml源碼:

<?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">   <ListView     android:id="@+id/lvNews"     android:layout_width="fill_parent"     android:layout_height="wrap_content"/> </LinearLayou 

包 com.andyidea.bean中News.java類源碼:

package com.andyidea.bean; public class News {      private String title;  //標題   private String content; //內容      public String getTitle() {     return title;   }   public void setTitle(String title) {     this.title = title;   }   public String getContent() {     return content;   }   public void setContent(String content) {     this.content = content;   }  } 

包com.andyidea.listview中paginationListViewActivity.java類源碼:

package com.andyidea.listview;  import java.util.ArrayList; import java.util.List;  import com.andyidea.bean.News;  import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast;  public class PaginationListViewActivity extends Activity implements OnScrollListener {      private ListView listView;    private int visibleLastIndex = 0;  //最後的可視項索引    private int visibleItemCount;    // 當前視窗可見項總數    private int datasize = 38;     //類比資料集的條數   private PaginationAdapter adapter;    private View loadMoreView;    private Button loadMoreButton;    private Handler handler = new Handler();       /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);          loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null);     loadMoreButton = (Button)loadMoreView.findViewById(R.id.loadMoreButton);     loadMoreButton.setOnClickListener(new View.OnClickListener() {              @Override       public void onClick(View v) {         loadMoreButton.setText("正在載入中...");  //設定按鈕文字         handler.postDelayed(new Runnable() {                      @Override           public void run() {             loadMoreData();             adapter.notifyDataSetChanged();             loadMoreButton.setText("查看更多..."); //恢複按鈕文字           }         },2000);                }     });          listView = (ListView)findViewById(R.id.lvNews);     listView.addFooterView(loadMoreView);  //設定列表底部視圖     initializeAdapter();     listView.setAdapter(adapter);     listView.setOnScrollListener(this);   }      @Override   public void onScrollStateChanged(AbsListView view, int scrollState) {     int itemsLastIndex = adapter.getCount()-1; //資料集最後一項的索引      int lastIndex = itemsLastIndex + 1;     if (scrollState == OnScrollListener.SCROLL_STATE_IDLE         && visibleLastIndex == lastIndex) {       // 如果是自動載入,可以在這裡放置非同步載入資料的代碼     }   }     @Override   public void onScroll(AbsListView view, int firstVisibleItem,       int visibleItemCount, int totalItemCount) {     this.visibleItemCount = visibleItemCount;     visibleLastIndex = firstVisibleItem + visibleItemCount - 1;          Log.e("========================= ","========================");     Log.e("firstVisibleItem = ",firstVisibleItem+"");     Log.e("visibleItemCount = ",visibleItemCount+"");     Log.e("totalItemCount = ",totalItemCount+"");     Log.e("========================= ","========================");          //如果所有的記錄選項等於資料集的條數,則移除列表底部視圖     if(totalItemCount == datasize+1){       listView.removeFooterView(loadMoreView);       Toast.makeText(this, "資料全部載入完!", Toast.LENGTH_LONG).show();     }   }      /**    * 初始化ListView的適配器    */   private void initializeAdapter(){     List<News> news = new ArrayList<News>();     for(int i=1;i<=10;i++){       News items = new News();       items.setTitle("Title"+i);       items.setContent("This is News Content"+i);       news.add(items);     }     adapter = new PaginationAdapter(news);   }      /**    * 載入更多資料    */   private void loadMoreData(){     int count = adapter.getCount();          if(count+10 <= datasize){       for(int i=count+1; i<=count+10; i++){         News item = new News();         item.setTitle("Title"+i);         item.setContent("This is News Content"+i);         adapter.addNewsItem(item);       }     }else{       for(int i=count+1; i<=datasize; i++){         News item = new News();         item.setTitle("Title"+i);         item.setContent("This is News Content"+i);         adapter.addNewsItem(item);       }     }        }         class PaginationAdapter extends BaseAdapter{          List<News> newsItems;          public PaginationAdapter(List<News> newsitems){       this.newsItems = newsitems;     }      @Override     public int getCount() {       return newsItems.size();     }      @Override     public Object getItem(int position) {       return newsItems.get(position);     }      @Override     public long getItemId(int position) {       return position;     }      @Override     public View getView(int position, View view, ViewGroup parent) {       if(view == null){         view = getLayoutInflater().inflate(R.layout.list_item, null);       }              //新聞標題       TextView tvTitle = (TextView)view.findViewById(R.id.newstitle);       tvTitle.setText(newsItems.get(position).getTitle());       //新聞內容       TextView tvContent = (TextView)view.findViewById(R.id.newscontent);       tvContent.setText(newsItems.get(position).getContent());              return view;     }          /**      * 添加資料清單項目      * @param newsitem      */     public void addNewsItem(News newsitem){       newsItems.add(newsitem);     }        }  } 

最後,運行程式的結果截圖如下:

通過上面的截圖,當我們點擊"查看更多..."按鈕時,就會載入下10條記錄,當載入完所有的記錄後,ListView的底部視圖將會移除。

希望本文所述對大家學習Android軟體編程有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.