Android使用listview實現分頁重新整理(線程休眠類比)_Android

來源:互聯網
上載者:User

當要顯示的資料過多時,為了更好的提升使用者感知,在很多APP中都會使用分頁重新整理顯示,比如瀏覽新聞,向下滑動到當前ListView的最後一條資訊(item)時,會提示重新整理載入,然後載入更新後的內容。此過程大致分以下幾步:

1.當前Activity implements OnScallListenner;

2.實現介面的方法;

3.ListView註冊滾動監聽;

4. Adapter(自訂或者安卓內建)為每個item填充資料;

5.獲得第二頁以後的資料後,adater增加資料並重新整理notifyDateSetChanged();(需要用到Handler)

現在我們就通過線程休眠的的方式類比ListView頁面重新整理的實現(每次載入10條資訊,向下滑動會分頁重新整理載入)

顯示效果(設定顯示十條後開啟重新整理,添加使用AlertDialog瀏覽樣本):

Layout中ListView布局activity_main.xml檔案:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.administrator.day08.MainActivity"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_alignParentStart="true" /></RelativeLayout>

Layout中item(填充ListView每行)布局item.xml檔案:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="vertical" android:layout_width="match_parent"  android:layout_height="match_parent">  <TextView    android:text="Tile"    android:textSize="30dp"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:id="@+id/textView" />  <TextView    android:text="Message"    android:textSize="20dp"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:id="@+id/textView2" /></LinearLayout>

Layout中頁面重新整理提示布局(頁尾)login_item.xml檔案:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="horizontal" android:layout_width="match_parent"  android:layout_height="match_parent" android:gravity="center">  <ProgressBar    style="?android:attr/progressBarStyle"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:id="@+id/progressBar" />  <TextView    android:text="玩命載入中"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:id="@+id/textView3" /></LinearLayout>

Java中自訂對象類(每條新聞有對應的標題以及內容) 

 public class News {   String title;   String message; }

Java中功能實作類別(通過實現OnScrollListener介面) 

import android.content.DialogInterface;import android.os.Handler;import android.os.Message;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/** * Created by panchengjia on 2016/11/29. */public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener{  private ListView lv;  private List<News> news;//聲明儲存新聞標題與內容的List  private int total=1;//計數器(設定預設從1開始)用於集合內資料初始化  MyAdapter adapter;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    lv= (ListView) findViewById(R.id.lv);    //為當前ListView設定OnScrollListener實現分頁重新整理    lv.setOnScrollListener(this);    //將login_item(下拉重新整理效果的item)通過布局 填充器聲明    View v = getLayoutInflater().inflate(R.layout.login_item,null);    //將login_item設定到ListView頁尾    lv.addFooterView(v);    //執行個體化儲存內容資源的List    news = new ArrayList<>();    //調用初始化List的方法    initList();    adapter = new MyAdapter();    //設定單擊item的事件    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {      @Override      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        show(view);//事件處理為調用show方法(顯示AlertDialog對話方塊)      }    });    lv.setAdapter(adapter);  }  //AlertDialog對話方塊的調用這裡就不多說了,前期有專門的博文解釋  public void show(View v){    AlertDialog.Builder builder = new AlertDialog.Builder(this);    TextView title = (TextView) v.findViewById(R.id.textView);    TextView message = (TextView) v.findViewById(R.id.textView2);    builder.setTitle(title.getText().toString());    builder.setMessage(message.getText().toString());    builder.setPositiveButton("已經瀏覽完畢", new DialogInterface.OnClickListener() {      @Override      public void onClick(DialogInterface dialog, int which) {      }    });    builder.show();  }  //初始化List內的元素,類比每次可重新整理10條資訊  private void initList() {    for(int i=1;i<=10;i++){      News n = new News();      //加total是因為total在重新整理頁面後不會繼續從一開始      n.title = "Title--"+total;      n.message="Message"+total;      news.add(n);      total++;    }  }//  int currenVisibleItemCount;//聲明截止當前頁面看到的item總數(示範用)  boolean isLastRow=false;//判斷是否到ListView的最後一個item  @Override  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {    //firstVisibleItem位可見頁面的第一條在Arraylist中的下標,visibleItemCount為當前頁面item數//    currenVisibleItemCount = firstVisibleItem+visibleItemCount-1=totalItemCount;(示範用)    if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){      isLastRow=true;//判斷已經到最後一個item(即為footerView)    }  }  @Override  public void onScrollStateChanged(AbsListView view, int scrollState) {    /*判斷是否重新整理頁面之前,解釋一下scrollState的三種狀態    * 1.scrollState = SCROLL_STATE_TOUCH_SCROLL為手指按住螢幕滾動(未脫離螢幕);    * 2.scrollState = SCROLL_STATE_FLING可以理解為手指離開螢幕前,用力滑了一下,    *    手指離開後,頁面已然保持滾動;    * 3.scrollState = SCROLL_STATE_IDLE手指未接觸螢幕,且螢幕頁面保持靜止    * 開啟重新整理頁面的線程前,確保ListView已經到最後一行(Item)並且螢幕頁面保持靜止    * */    if(isLastRow&&scrollState==SCROLL_STATE_IDLE){      new Thread(new MyThread()).start();    }  }  //建立分頁重新整理線程(類比重新整理)  class MyThread implements Runnable{    @Override    public void run() {      try {        Thread.sleep(500);//設定線程休眠時間為500毫秒重新整理一次      } catch (InterruptedException e) {        e.printStackTrace();      }      initList();//重新初始化List      //線程內調用Handler執行頁面重新整理(後面會寫文對handler進行詳細剖析)      handler.sendEmptyMessage(1);    }  }  Handler handler = new Handler(){    @Override    public void handleMessage(Message msg) {      super.handleMessage(msg);      switch (msg.what){        case 1:          //強制調用適配器的getView來重新整理每個Item的內容。          adapter.notifyDataSetChanged();          break;      }    }  };  //自訂配接器  class MyAdapter extends BaseAdapter{    @Override    public int getCount() {      return news.size();    }    @Override    public Object getItem(int position) {      return news.get(position);    }    @Override    public long getItemId(int position) {      return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {      ViewHolder vh;      if(convertView==null){        convertView = getLayoutInflater().inflate(R.layout.item,null);        vh=new ViewHolder();        vh.message = (TextView) convertView.findViewById(R.id.textView2);        vh.title= (TextView) convertView.findViewById(R.id.textView);        convertView.setTag(vh);      }      vh= (ViewHolder) convertView.getTag();      vh.title.setText(news.get(position).title);      vh.message.setText(news.get(position).message);      return convertView;    }    class ViewHolder{      TextView title;      TextView message;    }  }}

至此ListView的分頁重新整理源碼已全部展示完成,個人認為實現此功能的核心為判斷是否達到當前ListView中的最後一條item(包含頁尾重新整理提示)以及理解scrollState的狀態,理解了這兩點,該功能的實現起來事半功倍。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

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