欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

實(shí)現(xiàn)的原理:

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

詳細(xì)的實(shí)現(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ù)項(xiàng)
 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);
  //自定義的滾動(dòng)監(jiān)聽事件
  MyOnScrollListener onScrollListener = new MyOnScrollListener(footer, data);
  //設(shè)置接口回調(diào)
  onScrollListener.setOnLoadDataListener(this);
  //設(shè)置ListView的滾動(dòng)監(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) {
  //首先判斷適配器是否為空,首次運(yùn)行肯定是為空的
  if (adapter == null) {
   //查到ListView控件
   mList = (ListView) findViewById(R.id.mList);
   //將底部加載一個(gè)加載更多的布局
   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項(xiàng)
 private int lastItem;

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

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

 //接口回調(diào)的實(shí)例
 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)的實(shí)例
 public void setOnLoadDataListener(OnloadDataListener listener) {
  this.listener = listener;
 }

 /**
  * 滑動(dòng)狀態(tài)變化
  *
  * @param view
  * @param scrollState 1 SCROLL_STATE_TOUCH_SCROLL是拖動(dòng) 2 SCROLL_STATE_FLING是慣性滑動(dòng) 0SCROLL_STATE_IDLE是停止 , 只有當(dāng)在不同狀態(tài)間切換的時(shí)候才會(huì)執(zhí)行
  */
 @Override
 public void onScrollStateChanged(AbsListView view, int scrollState) {
  //如果數(shù)據(jù)沒有加載,并且滑動(dòng)狀態(tài)是停止的,而且到達(dá)了最后一個(gè)item項(xiàng)
  if (!isLoading && lastItem == totalItemCount && scrollState == SCROLL_STATE_IDLE) {
   //顯示加載更多
   footer.setVisibility(View.VISIBLE);
   Handler handler = new Handler();
   //模擬一個(gè)延遲兩秒的刷新功能
   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 第一個(gè)可見的 item 的索引
  * @param visibleItemCount 可以顯示的 item的條數(shù)
  * @param totalItemCount 總共有多少個(gè) item
  */
 @Override
 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  //當(dāng)可見界面的第一個(gè)item + 當(dāng)前界面多有可見的界面?zhèn)€數(shù)就可以得到最后一個(gè)item項(xiàng)了
  lastItem = firstVisibleItem + visibleItemCount;
  //總listView的item個(gè)數(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實(shí)體類沒有注解,其他兩個(gè)主要實(shí)現(xiàn)類都已經(jīng)注釋了,關(guān)于自定義通用適配器的講解,本篇不做講解,如果想了解如何實(shí)現(xiàn)自定義通用適配器知識(shí)的可以查看: 

下面可以看看效果圖:

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

相關(guān)文章

最新評(píng)論