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

Android之ListView分頁加載數(shù)據(jù)功能實現(xiàn)代碼

 更新時間:2016年08月18日 14:37:15   作者:qq_27630169  
這篇文章主要為大家詳細(xì)介紹了Android之ListView分頁加載數(shù)據(jù)功能實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

什么是ListView分頁加載數(shù)據(jù)功能呢?在現(xiàn)在的大數(shù)據(jù)時代,我們不可能把某些數(shù)據(jù)全部展示到界面,好比我們經(jīng)常會看的QQ空間一樣,當(dāng)你看動態(tài)的時候,系統(tǒng)不可能會把所有好友的動態(tài)都展示在上面,你能看到的一般都是最新好友更新的動態(tài),假如你要看非最新的好友動態(tài),通常你都會手指向上滑動屏幕然后去查看,當(dāng)界面下滑到一定數(shù)量的時候,就會看到一個“查看更多”,然后突然停頓一下,系統(tǒng)會通過網(wǎng)絡(luò)去給你刷新其他動態(tài)信息,這樣的功能我們一般叫做數(shù)據(jù)下拉刷新功能,也就是我們的分頁加載功能,具體的實現(xiàn)是怎樣的呢?下面我們開始詳細(xì)講解。

實現(xiàn)的原理:

1. 首先要先確定默認(rèn)展示在ListView上的數(shù)據(jù),比如默認(rèn)在ListView上展示10條數(shù)據(jù)。
2. 將數(shù)據(jù)傳遞到自定義的適配器上,然后加載到ListView中。
3. 當(dāng)用戶將數(shù)據(jù)拉到最后一條的時候,就要開始刷新加載新數(shù)據(jù)了。
4. 通過監(jiān)聽ListView的滑動事件,判斷是否達(dá)到最后一條,如果達(dá)到最后一條則開始刷新。

詳細(xì)的實現(xiàn)步奏在代碼中詳細(xì)講解。

整體結(jié)構(gòu)如下:

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:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.company.listviewdeepknow.MainActivity">

 <ListView
  android:id="@+id/mList"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
 </ListView>
</RelativeLayout>

foot_boot.xml

<?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="70dp"
 android:gravity="center"
 android:orientation="horizontal">

 <ProgressBar
  android:id="@+id/progressBar"
  style="?android:attr/progressBarStyleSmall"
  android:layout_width="45dp"
  android:layout_height="45dp" />

 <TextView
  android:id="@+id/mLoad"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="加載更多..."
  android:textSize="20sp" />
</LinearLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="horizontal">

 <TextView
  android:id="@+id/mTv1"
  android:layout_width="100dp"
  android:layout_height="100dp"
  android:textSize="20sp" />

 <TextView
  android:id="@+id/mTv2"
  android:layout_width="100dp"
  android:layout_height="100dp"
  android:layout_alignParentRight="true"
  android:textSize="20sp" />
</RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity implements MyOnScrollListener.OnloadDataListener {
 //ListView展示的數(shù)據(jù)項
 private List<Student> data;
 //ListView控件
 private ListView mList;

 //自定義適配器
 MyAdapter adapter;

 //底部加載更多布局
 View footer;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //首先加載默認(rèn)數(shù)據(jù),這里設(shè)置為10條
  getData();
  //顯示到ListView上
  showListView(data);
  //自定義的滾動監(jiān)聽事件
  MyOnScrollListener onScrollListener = new MyOnScrollListener(footer, data);
  //設(shè)置接口回調(diào)
  onScrollListener.setOnLoadDataListener(this);
  //設(shè)置ListView的滾動監(jiān)聽事件
  mList.setOnScrollListener(onScrollListener);
 }

 /**
  * 初始化ListView數(shù)據(jù),默認(rèn)設(shè)置為10條
  */
 private void getData() {
  data = new ArrayList<>();
  Student stu = null;
  for (int i = 0; i < 10; i++) {
   stu = new Student();
   stu.setName("姓名" + i);
   stu.setSex(i % 2 == 0 ? "男" : "女");
   data.add(stu);
  }
 }

 /**
  * 將數(shù)據(jù)加載到ListView上
  *
  * @param data
  */
 private void showListView(List<Student> data) {
  //首先判斷適配器是否為空,首次運行肯定是為空的
  if (adapter == null) {
   //查到ListView控件
   mList = (ListView) findViewById(R.id.mList);
   //將底部加載一個加載更多的布局
   footer = LayoutInflater.from(this).inflate(R.layout.foot_boot, null);
   //初始狀態(tài)為隱藏
   footer.setVisibility(View.GONE);
   //加入到ListView的底部
   mList.addFooterView(footer);
   //創(chuàng)建adpter數(shù)據(jù)
   adapter = new MyAdapter(data);
   //設(shè)置adapter
   mList.setAdapter(adapter);
  } else {
   //不為空,則刷新數(shù)據(jù)
   this.data = data;
   //提醒ListView重新更新數(shù)據(jù)
   adapter.notifyDataSetChanged();
  }
 }


 @Override
 public void onLoadData(List<Student> data) {
  //加載數(shù)據(jù)完成后,展示數(shù)據(jù)到ListView
  showListView(data);
 }
}

MyOnScrollListener.java

public class MyOnScrollListener implements AbsListView.OnScrollListener {

 //ListView總共顯示多少條
 private int totalItemCount;

 //ListView最后的item項
 private int lastItem;

 //用于判斷當(dāng)前是否在加載
 private boolean isLoading;

 //底部加載更多布局
 private View footer;

 //接口回調(diào)的實例
 private OnloadDataListener listener;

 //數(shù)據(jù)
 private List<Student> data;

 public MyOnScrollListener(View footer, List<Student> data) {
  this.footer = footer;
  this.data = data;
 }
 //設(shè)置接口回調(diào)的實例
 public void setOnLoadDataListener(OnloadDataListener listener) {
  this.listener = listener;
 }

 /**
  * 滑動狀態(tài)變化
  *
  * @param view
  * @param scrollState 1 SCROLL_STATE_TOUCH_SCROLL是拖動 2 SCROLL_STATE_FLING是慣性滑動 0SCROLL_STATE_IDLE是停止 , 只有當(dāng)在不同狀態(tài)間切換的時候才會執(zhí)行
  */
 @Override
 public void onScrollStateChanged(AbsListView view, int scrollState) {
  //如果數(shù)據(jù)沒有加載,并且滑動狀態(tài)是停止的,而且到達(dá)了最后一個item項
  if (!isLoading && lastItem == totalItemCount && scrollState == SCROLL_STATE_IDLE) {
   //顯示加載更多
   footer.setVisibility(View.VISIBLE);
   Handler handler = new Handler();
   //模擬一個延遲兩秒的刷新功能
   handler.postDelayed(new Runnable() {
    @Override
    public void run() {
     if (listener != null) {
      //開始加載更多數(shù)據(jù)
      loadMoreData();
      //回調(diào)設(shè)置ListView的數(shù)據(jù)
      listener.onLoadData(data);
      //加載完成后操作什么
      loadComplete();
     }
    }
   }, 2000);
  }
 }

 /**
  * 當(dāng)加載數(shù)據(jù)完成后,設(shè)置加載標(biāo)志為false表示沒有加載數(shù)據(jù)了
  * 并且設(shè)置底部加載更多為隱藏
  */
 private void loadComplete() {
  isLoading = false;
  footer.setVisibility(View.GONE);

 }

 /**
  * 開始加載更多新數(shù)據(jù),這里每次只更新三條數(shù)據(jù)
  */
 private void loadMoreData() {
  isLoading = true;
  Student stu = null;
  for (int i = 0; i < 3; i++) {
   stu = new Student();
   stu.setName("新名字" + i);
   stu.setSex("新性別" + i);
   data.add(stu);
  }
 }


 /**
  * 監(jiān)聽可見界面的情況
  *
  * @param view    ListView
  * @param firstVisibleItem 第一個可見的 item 的索引
  * @param visibleItemCount 可以顯示的 item的條數(shù)
  * @param totalItemCount 總共有多少個 item
  */
 @Override
 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  //當(dāng)可見界面的第一個item + 當(dāng)前界面多有可見的界面?zhèn)€數(shù)就可以得到最后一個item項了
  lastItem = firstVisibleItem + visibleItemCount;
  //總listView的item個數(shù)
  this.totalItemCount = totalItemCount;
 }
 //回調(diào)接口
 public interface OnloadDataListener {
  void onLoadData(List<Student> data);
 }
}

MyAdapter.java

public class MyAdapter extends MyBaseAdapter<Student> {

 public MyAdapter(List<Student> data) {
  super(data);
 }

 @Override
 public void setData(ViewHolder holder, Student t) {
  holder.setText(R.id.mTv1, t.getName()).setText(R.id.mTv2, t.getSex());

 }

}

MyBaseAdapter.java

public abstract class MyBaseAdapter<T> extends BaseAdapter {
 protected List<T> data;
 public MyBaseAdapter(List<T> data){
  this.data = data;
 }
 @Override
 public int getCount() {
  return data == null ? 0 : data.size();
 }

 @Override
 public Object getItem(int position) {
  return data.get(position);
 }

 @Override
 public long getItemId(int position) {
  return position;
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder = ViewHolder.getHolder(convertView,parent,position, R.layout.list_item);
  setData(holder,data.get(position));
  return holder.getConvertView();
 }
 public abstract void setData(ViewHolder holder,T t);
}

ViewHolder.java

public class ViewHolder {
 private int position;
 private SparseArray<View> array;
 private View convertView;
 private Context context;

 private ViewHolder(ViewGroup parent, int position, int layout) {
  this.position = position;
  this.context = parent.getContext();
  convertView = LayoutInflater.from(parent.getContext()).inflate(layout, null);
  convertView.setTag(this);
  array = new SparseArray<>();
 }

 public static ViewHolder getHolder(View convertView, ViewGroup parent, int position, int layout) {
  if (convertView == null) {
   return new ViewHolder(parent, position, layout);
  } else {
   ViewHolder holder = (ViewHolder) convertView.getTag();
   holder.position = position;
   return holder;
  }
 }

 public <T extends View> T getView(int viewId) {
  View view = array.get(viewId);
  if (view == null) {
   view = convertView.findViewById(viewId);
   array.put(viewId, view);
  }
  return (T) view;
 }

 public View getConvertView() {
  return convertView;
 }

 public ViewHolder setText(int viewId, String data) {
  TextView tv = getView(viewId);
  tv.setText(data);
  return this;
 }

 Student.java

public class Student {
 private String name;
 private String sex;

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getSex() {
  return sex;
 }

 public void setSex(String sex) {
  this.sex = sex;
 }
}

除了MyAdapter.java MyBaseAdapter.java ViewHolder.java 以及 Student.java實體類沒有注解,其他兩個主要實現(xiàn)類都已經(jīng)注釋了,關(guān)于自定義通用適配器的講解,本篇不做講解,如果想了解如何實現(xiàn)自定義通用適配器知識的可以查看: 

下面可以看看效果圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 老生常談Listview中onItemClick中的各個參數(shù)(推薦)

    老生常談Listview中onItemClick中的各個參數(shù)(推薦)

    下面小編就為大家?guī)硪黄仙U凩istview中onItemClick中的各個參數(shù)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android UI實現(xiàn)單行文本水平觸摸滑動效果

    Android UI實現(xiàn)單行文本水平觸摸滑動效果

    這篇文章主要為大家詳細(xì)介紹了Android UI實現(xiàn)單行文本水平觸摸滑動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • android 之listview 優(yōu)化方法

    android 之listview 優(yōu)化方法

    這篇文章主要介紹了android 之listview 優(yōu)化方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Android之禁止ViewPager滑動實現(xiàn)實例

    Android之禁止ViewPager滑動實現(xiàn)實例

    這篇文章主要介紹了Android之禁止ViewPager滑動實現(xiàn)實例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Kotlin封裝RecyclerView Adapter實例教程

    Kotlin封裝RecyclerView Adapter實例教程

    這篇文章主要給大家介紹了關(guān)于Kotlin封裝RecyclerView Adapter的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • android多線程斷點下載-帶進(jìn)度條和百分比進(jìn)度顯示效果

    android多線程斷點下載-帶進(jìn)度條和百分比進(jìn)度顯示效果

    下面小編就為大家?guī)硪黄猘ndroid多線程斷點下載-帶進(jìn)度條和百分比進(jìn)度顯示效果。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Android 多媒體播放API簡單實例

    Android 多媒體播放API簡單實例

    這篇文章主要介紹了Android 多媒體播放API簡單實例的相關(guān)資料,這里附有代碼實例及實現(xiàn)效果圖,需要的朋友可以參考下
    2016-12-12
  • 基于Android Flutter編寫貪吃蛇游戲

    基于Android Flutter編寫貪吃蛇游戲

    貪吃蛇是一款足夠經(jīng)典的游戲。本文將利用Android中的Flutter編寫這一經(jīng)典的小游戲,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-03-03
  • Android Studio 實現(xiàn)將support庫改成Androidx

    Android Studio 實現(xiàn)將support庫改成Androidx

    這篇文章主要介紹了Android Studio 實現(xiàn)將support庫改成Androidx,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Android WebView實現(xiàn)網(wǎng)頁滾動截圖

    Android WebView實現(xiàn)網(wǎng)頁滾動截圖

    這篇文章主要為大家詳細(xì)介紹了Android WebView實現(xiàn)網(wǎng)頁滾動截圖,對整個網(wǎng)頁進(jìn)行截屏,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評論