上拉加载,下拉刷新

来源:互联网 发布:苹果7下载软件 编辑:程序博客网 时间:2024/04/28 04:18
  • 前言:找下拉刷新,上拉加载的demo找了好久,踩找到这个相对完美的。所以分享给大家。
  • 先看原版的话可以去这里 .这个组件很强大,下面给各位看官介绍下。
  • 这里是XListView工具现在的路径:
    (https://github.com/Maxwin-z/XListView-Android)

XListView继承ListView。
- 下拉刷新组件是ListView的一个Header。在ListView创建时就将这个自定义View塞进去,默认情况是看不到的,所以这个HeaderView的高度初始设置为0。
- 上拉载入更多组件是Footer,为了确保这个footer在最后(可能会添加多个自定义footer),在用户调用setAdatper的时候再把这个footer塞进去。
- 覆写ListView的onTouchEvent方法,处理各种情况。
- 用户松手,启动mScroller,将header、footer回滚到所需状态。
- 添加了用户下拉、上拉移动delay的效果,类似iOS的行为。
- 提供了两个接口: a) IXListViewListener: 触发下拉刷新、上拉载入更多 b) OnXScrollListener: 这个和原生的OnScrollListener一样,但是在mScroller回滚时,也会触发这里的事件。 碰到的问题:
- 用户下拉回推时,不断修改header的高度,但这时候滚动条指示器的位置还是按老的高度计算的,需要强制调用一下setSelection(0)将ListView滚动到顶部。
-
- 下拉刷新最主要的流程是:
(1). 下拉,显示提示头部界面(HeaderView),这个过程提示用户”下拉刷新”
(2). 下拉到一定程度,超出了刷新最基本的下拉界限,我们认为达到了刷新的条件,提示用户可以”松手刷新”了,效果上允许用户继续下拉
(3). 用户松手,可能用户下拉远远不止提示头部界面,所以这一步,先反弹回仅显示提示头部界面,然后提示用户”正在加载”。

下面我们介绍一下怎么导入工具
选择

  • 打开工具我们只选择其中一个包下的来做工具 view包
    复制view包

下面我们来写布局

  • 引用me.maxwin.view.XListView
  • 复制路径me.maxwin.view.XListView
    这里写图片描述
<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/lv_main_list"        android:layout_width="wrap_content"        android:layout_height="wrap_content"         /></RelativeLayout>
  • 还需要几个布局文件
    这里写图片描述
  • 布局的详细
  • xlistview_footer.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content" >    <RelativeLayout        android:id="@+id/xlistview_footer_content"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:padding="10dp" >        <ProgressBar            android:id="@+id/xlistview_footer_progressbar"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:visibility="invisible" />        <TextView            android:id="@+id/xlistview_footer_hint_textview"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="@string/xlistview_footer_hint_normal" />    </RelativeLayout></LinearLayout>

xlistview_header.xml文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:gravity="bottom" >    <RelativeLayout        android:id="@+id/xlistview_header_content"        android:layout_width="fill_parent"        android:layout_height="60dp" >        <LinearLayout            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:gravity="center"            android:orientation="vertical" android:id="@+id/xlistview_header_text">            <TextView                android:id="@+id/xlistview_header_hint_textview"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="@string/xlistview_header_hint_normal" />            <LinearLayout                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginTop="3dp" >                <TextView                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:text="@string/xlistview_header_last_time"                    android:textSize="12sp" />                <TextView                    android:id="@+id/xlistview_header_time"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:textSize="12sp" />            </LinearLayout>        </LinearLayout>        <ImageView            android:id="@+id/xlistview_header_arrow"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignLeft="@id/xlistview_header_text"            android:layout_centerVertical="true"            android:layout_marginLeft="-35dp"            android:src="@drawable/xlistview_arrow" />        <ProgressBar            android:id="@+id/xlistview_header_progressbar"            android:layout_width="30dp"            android:layout_height="30dp"            android:layout_alignLeft="@id/xlistview_header_text"            android:layout_centerVertical="true"            android:layout_marginLeft="-40dp"            android:visibility="invisible" />    </RelativeLayout></LinearLayout>

ListView适配器的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" >    <ImageView         android:id="@+id/list_image"        android:layout_width="100dp"        android:layout_height="100dp"        android:src="@drawable/ic_launcher"        />   <TextView         android:id="@+id/list_text"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="1111111111"        /></LinearLayout>

需要配置一下values文件夹下的strings.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">上拉加载下拉刷新</string>    <string name="action_settings">Settings</string>    <string name="hello_world">Hello world!</string> <string name="xlistview_header_hint_normal">下拉刷新</string><string name="xlistview_header_hint_ready">松开刷新数据</string><string name="xlistview_header_hint_loading">正在加载...</string><string name="xlistview_header_last_time">上次更新时间:</string> <string name="xlistview_footer_hint_normal">查看更多</string>   <string name="xlistview_footer_hint_ready">松开载入更多</string></resources>
  • 自定义添加加载图片
    这里写图片描述

    这里写图片描述
    下面java代码

package com.example.jiazai;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.List;import com.bwei.listview.bean.GsonBean;import com.bwei.listview.bean.GsonBean.Myresult.Mylist;import com.bwei.listview.imafeloader.ImageLoaderUtils;import com.example.jiazai.BaseAdapter.MyBaseAdapter;import com.example.jiazai.utile.MyUtile;import com.google.gson.Gson;import com.nostra13.universalimageloader.core.DisplayImageOptions;import me.maxwin.view.XListView;import me.maxwin.view.XListView.IXListViewListener;import android.os.AsyncTask;import android.os.Bundle;import android.app.Activity;public class MainActivity extends Activity implements IXListViewListener{    //http://v.juhe.cn/weixin/query?key=d46c2eb6f2380736bf4106c0b9b0fb01    //定义变量    private int currentState;    //定义刷新时的属性    private int STATE_REFRESH = 1;    //加载时的属性    private int STATE_LOAD = 2;    private XListView xListView;    private int pno=1;    private String path="http://v.juhe.cn/weixin/query?key=d46c2eb6f2380736bf4106c0b9b0fb01&pno=";    private DisplayImageOptions options;    private MyAsyncTask myAsyncTask;    private MyBaseAdapter myBaseAdapter;    private List<Mylist> list=new ArrayList<GsonBean.Myresult.Mylist>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //调用ImageLoader的方法        options = ImageLoaderUtils.initOptions();        //控件        xListView = (XListView) findViewById(R.id.lv_main_list);        //设置下来加载有效        xListView.setPullLoadEnable(true);        //设置一个监听        xListView.setXListViewListener(this);        //实例化异步        myAsyncTask = new MyAsyncTask();        myAsyncTask.execute(path+pno);    }    /*     * 刷新     * */    @Override    public void onRefresh() {        // TODO Auto-generated method stub        //变量等于刷新值        currentState=STATE_REFRESH;        //实例化异步        MyAsyncTask myAsyncTask2 = new MyAsyncTask();        myAsyncTask2.execute(path);    }    /*     * 加载     * */    @Override    public void onLoadMore() {        // TODO Auto-generated method stub    //变量等于加载    currentState=STATE_LOAD;    pno++;    MyAsyncTask myAsyncTask3 = new MyAsyncTask();    myAsyncTask3.execute(path+pno);    }    //定义方法停止刷新停止加载    private void onLoad(){        //停止刷新        xListView.stopRefresh();        //停止加载        xListView.stopLoadMore();        //读取时间的超时        xListView.setRefreshTime("刚刚");    }    /*请求数据     *     */     public String getString(String path){        try {            URL url = new URL(path);HttpURLConnection openConnection=(HttpURLConnection) url.openConnection();openConnection.setConnectTimeout(5000);openConnection.setReadTimeout(5000);int responseCode = openConnection.getResponseCode();     if (responseCode==200) {InputStream inputStream = openConnection.getInputStream(); String byte1 = MyUtile.getByte(inputStream);                  return byte1;            }        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }//异步 class MyAsyncTask extends AsyncTask<String, Void, String>{    @Override    protected String doInBackground(String... params) {        // TODO Auto-generated method stub        String string = getString(params[0]);        return string;    }     @Override    protected void onPostExecute(String result) {        // TODO Auto-generated method stub        super.onPostExecute(result);        Gson gson=new Gson();        GsonBean fromJson = gson.fromJson(result,GsonBean.class);        if (currentState==STATE_REFRESH) {            list.clear();        }        list.addAll(fromJson.result.list);        if (myBaseAdapter==null) {            //设置适配器            myBaseAdapter = new MyBaseAdapter(options,list,MainActivity.this);            xListView.setAdapter(myBaseAdapter);        } else {            myBaseAdapter.notifyDataSetChanged();        }        //定义方法停止刷新停止加载        onLoad();    } }}
0 0
原创粉丝点击