上拉加载,下拉刷新
来源:互联网 发布:苹果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包
下面我们来写布局
- 引用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(); } }}
- 上拉加载 下拉刷新
- 下拉刷新 * 上拉加载
- 上拉刷新 下拉加载
- 下拉刷新,上拉加载
- 上拉刷新下拉加载
- 下拉刷新,上拉加载
- 上拉刷新,下拉加载
- 上拉刷新下拉加载
- 上拉刷新下拉加载
- 上拉加载,下拉刷新
- 上拉刷新,下拉加载
- 下拉刷新,上拉加载
- 上拉加载,下拉刷新
- 上拉刷新,下拉加载
- 下拉加载上拉刷新
- 下拉刷新-上拉加载
- 上拉刷新,下拉加载
- 上拉加载,下拉刷新
- 【webrtc】音频采集-链接错误总结
- Spring Aop 中的JDK动态代理的实现
- web.xml <web-app>中xmlns="http://java.sun.com/xml/ns/j2ee"这一句是什么意思??
- IOS开发:按钮控件
- 面向对象
- 上拉加载,下拉刷新
- 《剑指offer》面试题3 二维数组中的查找(杨氏矩阵)
- 【Qt开发】窗口切换
- OC中的私有方法
- java之GUI-------JButton的使用
- 关系型数据库和非关系型数据库的默认端口
- 删除字符串中重复的字符串
- Java HashMap源码分析
- Java之GUI-------边界布局管理器