当前位置: 移动技术网 > 移动技术>移动开发>Android > Android ListView分页简单实现

Android ListView分页简单实现

2019年07月24日  | 移动技术网移动技术  | 我要评论

android listview分页简单实现

分页,开发应用中必不可少。那么,现在就来实现分页功能。

首先来想想实现它要有哪些步骤,

1, 实现的组件,
2、初始化第一页数据,
3,底部布局 ,
4,加载数据的条件
5、获取下一页的数据。

有了思路,我们一步步来实现就行了。先来想想我们用什么组件实现,我们知道列表ui我们常用listview或者recyclerview,初始化数据,我们就在通过一个for循环来准备数据,底部布局我们直接使progressbar控件和一个textview来显示就可以了。至于,加载的数据,我们就使用onscrolllistener来监听滑动事件,然后在满足加载条件时,我们就可以加载下一页的数据了。

先来看看listview实现:

自定义listview (loadlistview.java):

public class loadlistview extends listview implements abslistview.onscrolllistener{
  private layoutinflater minflater;
  //判断是否滚动最后一行
  private boolean islastrow = false;
  //底部view布局
  private view mfooter;
  //实现接口加载更多数据
  public onloadmorelistener morelistener;

  public void setloadmorelistener(onloadmorelistener morelistener){
    this.morelistener = morelistener;
  }
  public loadlistview(context context) {
    super(context);
    initview();
  }

  public loadlistview(context context, attributeset attrs) {
    super(context, attrs);
    initview();
  }

  public loadlistview(context context, attributeset attrs, int defstyleattr) {
    super(context, attrs, defstyleattr);
    initview();
  }
  private void initview(){
    minflater = layoutinflater.from(getcontext());
    mfooter = minflater.inflate(r.layout.
    listview_footer,null);
    this.addfooterview(mfooter);
    mfooter.setvisibility(view.gone);
    setonscrolllistener(this);
  }

  @override
  public void onscrollstatechanged(abslistview abslistview, int scrollstate) {
    //正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollstate = 2的这次不回调
    //回调顺序如下
    //第1次:scrollstate = scroll_state_touch_scroll(1) 正在滚动
    //第2次:scrollstate = scroll_state_fling(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下)
    //第3次:scrollstate = scroll_state_idle(0) 停止滚动
    //当屏幕停止滚动时为0;当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1;
    //由于用户的操作,屏幕产生惯性滑动时为2

    //当滚到最后一行且停止滚动时,执行加载 
    if(islastrow&&scrollstate== onscrolllistener.scroll_state_idle){
      mfooter.setvisibility(view.visible);
      islastrow = false;
      if(morelistener!=null){
        morelistener.loadmore();
      }
    }
  }

  @override
  public void onscroll(abslistview abslistview, int firstvisibleitem,
             int visibleitemcount, int totalitemcount) {
    //滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。
    //firstvisibleitem:当前能看见的第一个列表项id(从0开始)
    //visibleitemcount:当前能看见的列表项个数(小半个也算)
    //totalitemcount:列表项共数
    //判断是否滚到最后一行
    if (firstvisibleitem + visibleitemcount == totalitemcount && totalitemcount > 0) {
      islastrow = true;
    }
  }
  public interface onloadmorelistener{
    void loadmore();
  }
}

底部布局listfooter.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="wrap_content"
  android:orientation="vertical">
  <progressbar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toleftof="@+id/id_loadmore"
    android:layout_marginright="5dp" />
  <textview
    android:id="@+id/id_loadmore"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="加载更多"
    android:layout_centerhorizontal="true"
    android:layout_centervertical="true"/>
</relativelayout>

mainactivity.java的源码:

public class mainactivity extends activity implements loadlistview.onloadmorelistener {
  private list<news> list = new arraylist<>() ;
  private loadadapter madapter;
  private loadlistview mlistview;
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    loadmoredata();
    mlistview =(loadlistview) findviewbyid(r.id.id_list_view);
    madapter = new loadadapter(this,list);
    mlistview.setadapter(madapter);
    mlistview.setloadmorelistener(this);
  }
  private void loadmoredata(){
    for(int i = 0 ; i <10;i++){
      news news = new news();
      news.settitle("许巍");
      news.setcontent("蓝莲花");
      list.add(news);
    }
  }

  @override
  public void loadmore() {
    new handler().postdelayed(new runnable() {
      @override
      public void run() {
        loadmoredata();
        showloadmore();
      }
    },2000);

  }
  private void showloadmore(){
    madapter.notifydatasetchanged();
  }
}

loadadapter.java

public class loadadapter extends baseadapter {
  private list<news> list;
  private context mcontext;
  public loadadapter(context context,list<news> list){
    this.list = list;
    this.mcontext = context;
  }

  @override
  public int getcount() {
    return list.size();
  }

  @override
  public object getitem(int position) {
    return position;
  }

  @override
  public long getitemid(int position) {
    return position;
  }

  @override
  public view getview(int position, view convertview, viewgroup parent) {
    viewholder viewholder;
    if(convertview==null){
      viewholder = new viewholder();
      convertview = layoutinflater.from(mcontext).inflate(r.layout.item_news,null);
      viewholder.title = (textview) convertview.findviewbyid(r.id.id_title);
      viewholder.content = (textview)convertview.findviewbyid(r.id.id_content);
      convertview.settag(viewholder);
    }else {
      viewholder = (viewholder) convertview.gettag();
    }
    viewholder.title.settext(list.get(position).gettitle());
    viewholder.content.settext(list.get(position).getcontent());
    return convertview;
  }

  public class viewholder{
    private textview title;
    private textview content;
  }

}

activity_main.xml:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <view.loadlistview
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/id_list_view"
    />
</linearlayout>

item_news.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="match_parent"
  android:orientation="vertical">
<textview
  android:id="@+id/id_title"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text=""
  android:gravity="center"
  android:padding="5dp"/>
  <textview
    android:id="@+id/id_content"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text=""
    android:gravity="center"
    android:padding="5dp"/>
</linearlayout>

其实只要掌握了onscrolllistener的回调,那么就很简单了。recyclerview也出现很久了,慢慢的,recyclerview也会替代了listview,所以listview分页似乎就过时了,我们想知道的是recyclerview怎么实现分页。但是我们知道recyclerview不能实现头部和底部的添加,所以我们要自己来实现一个能添加头部和底部的reyclerview。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网