欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android XListView下拉刷新和上拉加载更多

程序员文章站 2024-02-29 17:35:34
市面上有好多的类比listview刷新数据的开源框架,如:v4包自带的swiperefreshlayout ,以及集listview、gridview甚至webview于一...

市面上有好多的类比listview刷新数据的开源框架,如:v4包自带的swiperefreshlayout ,以及集listview、gridview甚至webview于一身的pulltorefresh等等。前述的两个开源框架目前使用也算频繁。有兴趣的读者可以自行搜索,当然有时间一定回来对所有的使用方式做一个汇总和比较。今天介绍的这款框架,专门针对listview做下拉刷新与上拉加载的,如果单单是listview就显得更加简单方便易于理解。
1、首先引入xlistview_lib库到自己的demo上
2、使用步骤
它的使用步骤跟普通的listview是一样,这也是选择它的原因。使用非常简单方便。
布局如下so easy:

<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" > 
 
  <me.maxwin.view.xlistview 
    android:id="@+id/xlv" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 
 
</relativelayout> 

按照listview的方式使用xlistview:

package com.itydl.xlistviewdemo; 
 
import java.util.arraylist; 
import java.util.list; 
 
import me.maxwin.view.xlistview; 
import android.os.bundle; 
import android.app.activity; 
import android.graphics.color; 
import android.view.menu; 
import android.view.view; 
import android.view.viewgroup; 
import android.widget.baseadapter; 
import android.widget.textview; 
 
public class mainactivity extends activity { 
 
  private xlistview mxlistview; 
  list<string> datas = new arraylist<string>(); 
  private myadapter adapter; 
 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.activity_main); 
    initdatas(); 
    mxlistview = (xlistview) findviewbyid(r.id.xlv); 
    //设置适配器到listview 
    adapter = new myadapter(); 
    mxlistview.setadapter(adapter); 
  } 
   
  /**模拟网络数据*/ 
  private void initdatas() { 
    for (int i = 0; i < 50; i++) { 
      datas.add("我是第" + i + "条数据"); 
    } 
  } 
 
  private class myadapter extends baseadapter{ 
 
    @override 
    public int getcount() { 
      if(datas != null){ 
        return datas.size(); 
      } 
      return 0; 
    } 
 
    @override 
    public object getitem(int position) { 
      if(datas != null){ 
        return datas.get(position); 
      } 
      return null; 
    } 
 
    @override 
    public long getitemid(int position) { 
      return position; 
    } 
 
    @override 
    public view getview(int position, view convertview, viewgroup parent) { 
      //模拟item为textview 
      textview textview = new textview(mainactivity.this); 
      textview.settext(getitem(position)+""); 
      textview.settextcolor(color.green); 
      return textview; 
    } 
     
  } 
} 

运行结果:

Android XListView下拉刷新和上拉加载更多

上边只是做了展示,并没有任何加载和刷新的效果。接下来就以完整代码形式,实现加载更多与刷新。

package com.itydl.xlistviewdemo; 
 
import java.text.simpledateformat; 
import java.util.arraylist; 
import java.util.date; 
import java.util.list; 
 
import me.maxwin.view.xlistview; 
import me.maxwin.view.xlistview.ixlistviewlistener; 
import android.app.activity; 
import android.graphics.color; 
import android.os.bundle; 
import android.os.handler; 
import android.os.message; 
import android.os.systemclock; 
import android.view.view; 
import android.view.viewgroup; 
import android.widget.baseadapter; 
import android.widget.textview; 
 
public class mainactivity extends activity { 
 
  private xlistview mxlistview; 
  list<string> datas = new arraylist<string>(); 
  private myadapter adapter; 
  private boolean isloadmore;//是否正在加载更多数据的标记 
   
  private long pretime;//上一次刷新的当前系统时间毫秒值 
  private handler handler = new handler(){ 
    public void handlemessage(android.os.message msg) { 
      if(isloadmore){ 
        //消息是上拉加载更多 
        initdatas(); 
        isloadmore = false; 
        //刷新完毕,关闭上拉加载效果 
        mxlistview.stoploadmore(); 
      }else{ 
        //消息是下拉刷新 
        datas.clear(); 
        initdatas(); 
        //刷新完毕,关闭下拉刷新效果 
        mxlistview.stoprefresh(); 
      } 
      // 刷新listview 
      adapter.notifydatasetchanged(); 
    }; 
  }; 
 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.activity_main); 
    initdatas(); 
    mxlistview = (xlistview) findviewbyid(r.id.xlv); 
    //设置适配器到listview 
    adapter = new myadapter(); 
    mxlistview.setadapter(adapter); 
    initlistener(); 
  } 
   
  private void initlistener() { 
    //设置可以下拉刷新,默认就是true 
    mxlistview.setpullrefreshenable(true); 
     
    //设置可以上拉加载,默认是false 
    mxlistview.setpullloadenable(true); 
     
    mxlistview.setxlistviewlistener(new ixlistviewlistener() { 
       
      @override 
      public void onrefresh() { 
        // 下拉刷新,实际发送handler 
        //发送一个空消息,延迟两秒后告知刷新数据 
        handler.sendmessagedelayed(message.obtain(), 2000); 
        //添加上一次刷新的时间: 
        if(pretime != 0){ 
          mxlistview.setrefreshtime(refreshdata(pretime)); 
        } 
        pretime = system.currenttimemillis(); 
      } 
 
      private string refreshdata(long pretime) { 
        return new simpledateformat("yyyy-mm-dd hh:mm:ss").format(new date(pretime)); 
      } 
 
      @override 
      public void onloadmore() { 
        //标记正在加载更多,发送handler 
        isloadmore = true; 
        handler.sendmessagedelayed(message.obtain(), 2000); 
      } 
    }); 
  } 
 
  /**模拟网络数据*/ 
  private void initdatas() { 
    //实际开发应该子线程执行 
    for (int i = 0; i < 50; i++) { 
      datas.add("我是第" + i + "条数据"); 
    } 
  } 
 
  private class myadapter extends baseadapter{ 
 
    @override 
    public int getcount() { 
      if(datas != null){ 
        return datas.size(); 
      } 
      return 0; 
    } 
 
    @override 
    public object getitem(int position) { 
      if(datas != null){ 
        return datas.get(position); 
      } 
      return null; 
    } 
 
    @override 
    public long getitemid(int position) { 
      return position; 
    } 
 
    @override 
    public view getview(int position, view convertview, viewgroup parent) { 
      //模拟item为textview 
      textview textview = new textview(mainactivity.this); 
      textview.settext(getitem(position)+""); 
      textview.settextcolor(color.green); 
      return textview; 
    } 
  } 
} 

在上边代码中,添加了刷新和加载,并且在下拉刷新的同时,加入了刷新时候系统时间值。
注意的地方:设置可否下拉刷新默认为true,加载更多默认为false。需要加入下面两行代码:

//设置可以下拉刷新,默认就是true 
mxlistview.setpullrefreshenable(true); 
 
//设置可以上拉加载,默认是false 
mxlistview.setpullloadenable(true); 

在刷新完毕,一定记得关闭,即需要下面两行代码:

//刷新完毕,关闭上拉加载效果
mxlistview.stoploadmore();


//刷新完毕,关闭下拉刷新效果 
mxlistview.stoprefresh(); 

运行看看效果:

Android XListView下拉刷新和上拉加载更多

如果想要改变它的样式,也是很简单的。因为它的头布局和为布局是独立开的,知直接去布局文件修改一下显示样式就可以了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。