亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android實現(xiàn)listview動態(tài)加載數(shù)據(jù)分頁的兩種方法

 更新時間:2016年06月01日 17:00:30   作者:wangyan9110  
這篇文章主要為大家詳細介紹了Android實現(xiàn)listview動態(tài)加載的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在android開發(fā)中,經常需要使用數(shù)據(jù)分頁,比如要實現(xiàn)一個新聞列表的顯示,或者博文列表的顯示,不可能第一次加載就展示出全部,這就需要使用分頁的方法來加載數(shù)據(jù),在android中Handler經常用來在耗時的工作中,它接收子線程發(fā)送的數(shù)據(jù),并使用數(shù)據(jù)配合更新UI,AsyncTask是在一個線程中執(zhí)行耗時操作然后把結果傳給UI線程,不需要你親自去管理線程和句柄。

一、使用Handler+線程方法
1、基礎知識
Handler在android系統(tǒng)中,主要負責發(fā)送和接收消息,它的用途主要有以下兩種:
(1)按照計劃來處理一個消息(sendMessage(Message)方法)或者執(zhí)行某個runnable實例(post(Runnable)方法)
(2)把其他的線程對象放入消息隊列中,避免線程沖突。
消息的發(fā)送通過post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int),sendMessage(Message), sendMessageAtTime(Message, long)和 sendMessageDelayed(Message, long) 方法完成。對于postXXX方法通過Runnable對象給消息隊列,并在消息隊列到達后被調用。對于sendMessageXXX方法,則傳遞一個包含message對象,該對象可以被Handler類的handlerMessage(Message)方法處理。
2、主要代碼

public class HandlerDemo extends Activity implements OnScrollListener {

 private ListView mListView;
 LinearLayout loadingLayout;
 private Thread mThread;
 private ListViewAdapter adapter;

 private int startIndex = 1;// 從第1條開始
 private int size = 10;// 每次下載十條數(shù)據(jù)
 private List<News> newsList;
 List<Map<String, String>> data ;

 /*
 * 設置布局顯示屬性
 */
 private LayoutParams mLayoutParams = new LayoutParams(
  LinearLayout.LayoutParams.WRAP_CONTENT,
  LinearLayout.LayoutParams.WRAP_CONTENT);

 private LayoutParams ffLayoutParams = new LayoutParams(
  LinearLayout.LayoutParams.FILL_PARENT,
  LinearLayout.LayoutParams.FILL_PARENT);

 private ProgressBar progressBar;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onCreate(savedInstanceState);
 setContentView(R.layout.news_main);
 data=new ArrayList<Map<String, String>>();
 addView();
 }

 private void addView() {
 if (startIndex == 1) {
  newsList = new ArrayList<News>();
  newsList = getNewsList();
 }
 getdata(newsList);
 LinearLayout layout = new LinearLayout(this);
 layout.setOrientation(LinearLayout.HORIZONTAL);
 progressBar = new ProgressBar(this);
 layout.addView(progressBar, mLayoutParams);
 TextView textView = new TextView(this);
 textView.setText("加載中...");
 textView.setGravity(Gravity.CENTER_VERTICAL);
 layout.addView(textView, ffLayoutParams);
 layout.setGravity(Gravity.CENTER);
 loadingLayout = new LinearLayout(this);
 loadingLayout.addView(layout, mLayoutParams);
 loadingLayout.setGravity(Gravity.CENTER);

 // 得到一個ListView用來顯示條目
 mListView = (ListView) findViewById(R.id.listView);
 mListView.addFooterView(loadingLayout);
 adapter = new ListViewAdapter();
 mListView.setAdapter(adapter);
 mListView.setOnScrollListener(this);
 mListView.setTextFilterEnabled(true);
 }

 @Override
 public void onScroll(AbsListView view, int firstVisibleItem,
  int visibleItemCount, int totalItemCount) {
 // TODO Auto-generated method stub
 if (firstVisibleItem + visibleItemCount == totalItemCount) {
  if (mThread == null || !mThread.isAlive()) {
  mThread = new Thread() {

   @Override
   public void run() {
   newsList = new ArrayList<News>();
   newsList = getNewsList();
   getdata(newsList);
   Message msg = new Message();
   msg.what = 1;
   handler.sendMessage(msg);
   }
  };
  mThread.run();
  }
 }
 }
 
 Handler handler = new Handler() {

 @Override
 public void handleMessage(Message msg) {
  // TODO Auto-generated method stub
  if (msg.what == 1) {
  startIndex = startIndex + size;
  Log.v("startindex", startIndex + "");
  mListView.removeFooterView(loadingLayout);
  mThread.stop();
  adapter.count += size;
  adapter.notifyDataSetChanged();
  return;
  }
 }
 };

 class ListViewAdapter extends BaseAdapter {
 int count = 10;

 @Override
 public int getCount() {
  // TODO Auto-generated method stub
  return count;
 }

 @Override
 public Object getItem(int position) {
  // TODO Auto-generated method stub
  return position;
 }

 @Override
 public long getItemId(int position) {
  // TODO Auto-generated method stub
  return position;
 }
 
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  // TODO Auto-generated method stub
  convertView = LayoutInflater.from(getApplicationContext()).inflate(
   R.layout.news_item, null);
  TextView textView = (TextView) convertView
   .findViewById(R.id.textNewsTitle);
  textView.setText((data.get(position)).get("title"));
  return convertView;
 }
 }

 @Override
 public void onScrollStateChanged(AbsListView view, int scrollState) {
 // TODO Auto-generated method stub

 }

 private List<Map<String, String>> getdata(List<News> list) {

 if (list == null)
  return null;
 for (News news : list) {
  Map<String, String> map = new HashMap<String, String>();
  map.put("title", news.getTitle());
  data.add(map);
 }
 return data;
 }

 /*
 * 獲取網絡數(shù)據(jù) 注:我是訪問本機的一個新聞服務,使用asp.net技術來實現(xiàn)的
 * 這個是項目是一個基于android的資訊播報軟件
 */
 private List<News> getNewsList() {
 String path = "http://10.0.2.2/getNewsList.aspx";
 String xmlStr = "<?xml version='1.0' encoding='utf-8'?><source><categoryIds>1,3,7</categoryIds><startIndex>"
  + startIndex
  + "</startIndex><detail>2</detail><count>"
  + size
  + "</count></source>";
 NewsConnector newsConnector = new NewsConnector();
 List<News> list = new ArrayList<News>();
 list = newsConnector.getNewsList(path, xmlStr);
 return list;
 }
}

3、小結
ListView使用Handler+線程方式來動態(tài)加載數(shù)據(jù)的步驟如下:
1.先初始化頁面(如:加載第一頁數(shù)據(jù))
2.在接收某個事件的消息之后(以上代碼是onScroll事件),啟動線程(線程完成下載數(shù)據(jù),并發(fā)送消息給handler)
3.handler接收到消息后更新界面,顯示數(shù)據(jù)。

二、使用AsyncTask方法
1、基礎知識
AsyncTask也是android提供的一個為了不能阻塞主線程的一個類,AsyncTask定義了三種泛型類型Params、Progress和Result,Params啟動任務執(zhí)行輸入?yún)?shù),比如http請求的url和參數(shù),Progress后臺執(zhí)行任務的百分比,后臺執(zhí)行最終返回的結果。
AsyncTask的執(zhí)行分為四個步驟,每一步都對應都對應一個回調方法,開發(fā)者需要實現(xiàn)一個或者幾個方法,在任務的執(zhí)行過程中,這些方法會自動調用。
onPreExecute(),在執(zhí)行后臺耗時操作前被調用,可以在執(zhí)行此方法中做一些ui操作,比如顯示一個進度條等
doInBackground(Params...),這個方法在執(zhí)行onPreExecute()后執(zhí)行,這個方法完成耗時工作,比如下載等。
onProgressUpdate(Progress...),UI線程通過此方法獲取任務的完成的情況,比如完成的任務的百分比。
onPostExecute(Result),這個方法在耗時工作完成后被調用。UI線程調用此方法獲取結果。
注意:在使用AsyncTask類,有幾條準則需要遵守
(1)、Task的實例必須在UI線程中創(chuàng)建
(2)、execute方法必須在UI線程中調用
(3)、不要手動調用以上四個方法
(4)、這個任務只執(zhí)行一次(如果執(zhí)行第二次將會拋出異常)
2、主要代碼

@Override
 public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
 // TODO Auto-generated method stub
 if(arg1+arg2==arg3)
 {
  if(!isloading)
  {
  new myAsyncTask().execute(null);
  }
  else
  {
  mListView.removeFooterView(loadingLayout);
  }
 }
 }

 @Override
 public void onScrollStateChanged(AbsListView arg0, int arg1) {
 // TODO Auto-generated method stub
 
 }
 
 private class myAsyncTask extends AsyncTask<Void, Void, Void>
 {

 @Override
 protected Void doInBackground(Void... params) {
  // TODO Auto-generated method stub
  
  newsList = new ArrayList<News>();
  newsList = getNewsList();
  getdata(newsList);
  return null;
  
 }

 @Override
 protected void onPostExecute(Void result) {
  // TODO Auto-generated method stub
  super.onPostExecute(result);
  adapter.count+=size;
  adapter.notifyDataSetChanged();
  startIndex+=size;
  isloading=false;
 }

 @Override
 protected void onPreExecute() {
  // TODO Auto-generated method stub
  super.onPreExecute();
  isloading=true;
 }
 
 }

注:以上僅是和使用Handler+線程方法不同的代碼,建議下載源碼:http://xiazai.jb51.net/201606/yuanma/NewsList(jb51.net).rar,了解詳細代碼
3、小結
ListView使用AsyncTask方法動態(tài)加載數(shù)據(jù)的方法如下:
1.和handler一樣初始化頁面(如:加載第一頁)
2.在接收某個事件的消息之后(以上代碼是onScroll事件),創(chuàng)建一個新的異步任務,并開始執(zhí)行
3.耗時工作完成后,開始更新UI 

三、總結
使用Handler+線程和使用AsyncTask方法進行ListView動態(tài)加載的比較
Handler+線程方式:
在使用Handler方式時,它涉及Handler、Thread、Message、Looper四個對象,在執(zhí)行的流程如下:主線程啟動一個Thread,這個Thread執(zhí)行耗時操作,耗時操作完成后,生成一個Message,Looper讀取Message并傳遞給Hander,Handler接收Message并更新響應的UI。因為Looper在一個message處理完,才會讀下一條,如果發(fā)生多個Message就會形成一個消息隊列,所以它對多個后臺操作比較清晰,明朗。但對于單個message來講顯得代碼比較多,過于復雜。
AsyncTask方式:
AsyncTask繼承自Object,是android提供的輕量級的異步類。并提供了一個方法來獲取任務的執(zhí)行進度(可以根據(jù)它來更新UI),最后會把結果返回在主線程。這個方式的比較簡單,而且可以清楚的看到耗時任務執(zhí)行的進度。但是對于多個異步操作同時進行,并更新UI變得比較復雜。

附件上截圖

參考文章:Android listview動態(tài)加載列表項實現(xiàn)代碼

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android仿QQ長按彈出刪除復制框

    Android仿QQ長按彈出刪除復制框

    這篇文章主要為大家詳細介紹了Android仿QQ長按彈出刪除、復制、轉發(fā)框,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Android Studio升級到4.1以后插件問題解決

    Android Studio升級到4.1以后插件問題解決

    這篇文章主要介紹了Android Studio升級到4.1以后插件問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Andriod使用多線程實現(xiàn)輪播圖片

    Andriod使用多線程實現(xiàn)輪播圖片

    這篇文章主要介紹了Andriod使用多線程實現(xiàn)輪播圖片效果,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10
  • android實現(xiàn)記住用戶名和密碼以及自動登錄

    android實現(xiàn)記住用戶名和密碼以及自動登錄

    這篇文章主要為大家詳細介紹了android實現(xiàn)記住用戶名和密碼以及自動登錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Android view滑動懸浮固定效果實現(xiàn)代碼示例

    Android view滑動懸浮固定效果實現(xiàn)代碼示例

    本篇文章主要介紹了Android view滑動懸浮固定效果實現(xiàn)代碼示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Android 使用<layer-list>實現(xiàn)微信聊天輸入框功能

    Android 使用<layer-list>實現(xiàn)微信聊天輸入框功能

    <layer-list> 標簽可以設置LayerDrawable,一種有層次的Drawable疊加效果,<layer-list> 可以包含多個 <item>標簽。這篇文章主要介紹了Android 使用<layer-list>實現(xiàn)微信聊天輸入框,需要的朋友可以參考下
    2017-05-05
  • Android圖片或拍照選擇圖片功能實例代碼

    Android圖片或拍照選擇圖片功能實例代碼

    這篇文章主要給大家介紹了關于Android圖片或拍照選擇圖片功能的相關資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Jetpack?Compose入門基礎全面精講

    Jetpack?Compose入門基礎全面精講

    開始布局部分。這部分我個人感覺沒有必要每個組件、屬性都詳細說到,否則篇幅會很長。建立起Compose中的組件與?Android?Views的一個對應關系就夠了。具體還是需要在實際的使用中去熟悉
    2022-10-10
  • Android客戶端與服務端交互

    Android客戶端與服務端交互

    這篇文章主要為大家詳細介紹了Android客戶端與服務端交互之登陸示例,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android優(yōu)化查詢加載大數(shù)量的本地相冊圖片

    Android優(yōu)化查詢加載大數(shù)量的本地相冊圖片

    本文介紹了Android優(yōu)化查詢加載大數(shù)量的本地相冊圖片,可以方便的照片的查詢,,感興趣的小伙伴們可以參考一下。
    2016-10-10

最新評論