实现XlistView的简洁方法PullToRefreshListView
来源:互联网 发布:u盘做linux启动盘 编辑:程序博客网 时间:2024/06/06 02:56
XListView是一个含有下拉刷新、上拉加载功能的控件。特点是代码量极少(只有3个java文件和2个xml文件即可实现),虽然功能较为单一,但是在项目开发中很实用。并且由于代码量小,可以很轻松的理解下拉刷新和下拉加载的源码机制,并加以自定制。
下拉刷新这个功能我们都比较常见了,下面我要介绍的就是这个功能的实现。下面就是我们比较常见的PullToRefreshListView,是让listView有下拉刷新功能。
首先他的
下载项目包,将library包导入即可,其他的包暂时不用
主视图
<?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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.bwie.myapplication123.MainActivity">
>
<com.handmark.pulltorefresh.library.PullToRefreshListView
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/pull_refresh_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#000000"
android:divider="#19000000"
android:dividerHeight="4dp"
android:fadingEdge="none"
android:fastScrollEnabled="false"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false"
android:smoothScrollbar="true"
ptr:ptrAnimationStyle="rotate"
ptr:ptrHeaderTextColor="#ffffff"
ptr:ptrHeaderSubTextColor="#00ffff"
ptr:ptrHeaderBackground="@null"
ptr:ptrDrawable="@mipmap/ic_launcher"/>
</RelativeLayout>
<?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">
<TextView
android:text="TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/newsname"
android:layout_weight="1" />
<TextView
android:text="TextView"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/newstime"
android:layout_weight="1" />
</LinearLayout>
开始编写代码
1.找到这个控件,并且设置监听器
这里面用到了一个日期的工具类,其实就是设置上次下拉的时间的。此外在下拉后会触发一个异步任务
package com.bwie.myapplication;import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private PullToRefreshListView listView;
private static final String JSON_URL = "http://www.93.gov.cn/93app/data.do?channelId=2&startNum=";
private ArrayList<News> newsList;
private MyBaseAdapter myAdatper;
private List<News.DataBean> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化组件
initView();
//初始化加载数据
initData();
}
public void initData(){
pullToRefreshData();
}
//下载刷新,加载数据,显示数据
public void pullToRefreshData(){
new AsyncTask<String,Integer,String>(){
@Override
protected String doInBackground(String... params) {
String json = new NetWorkUtil().getJsonByHttpUrlConnection(JSON_URL+"1");
return json;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//解析json
Gson gson =new Gson();
News news = gson.fromJson(s, News.class);
data = news.getData();
myAdatper = new MyBaseAdapter(MainActivity.this, data);
listView.setAdapter(myAdatper);
listView.onRefreshComplete();//停止刷新
}
}.execute();
}
int index = 1;
//下载刷新,加载数据,显示数据
public void loadMoreData(){
new AsyncTask<String,Integer,String>(){
@Override
protected String doInBackground(String... params) {
index++;
String json = new NetWorkUtil().getJsonByHttpUrlConnection(JSON_URL+index);
return json;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//解析json
/* SuperClass superClass = new Gson().fromJson(s, SuperClass.class);
newsList.addAll(superClass.getData());*/
Gson gson =new Gson();
News news = gson.fromJson(s, News.class);
data.addAll(news.getData());
myAdatper.notifyDataSetChanged();
}
}.execute();
}
public void initView(){
listView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
listView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
//当下拉刷新,进入此方法
Toast.makeText(MainActivity.this,"下拉刷新",Toast.LENGTH_SHORT).show();
//加载新数据,刷新显示
pullToRefreshData();
}
});
listView.setOnLastItemVisibleListener(new PullToRefreshBase.OnLastItemVisibleListener() {
@Override
public void onLastItemVisible() {
Toast.makeText(MainActivity.this,"上拉显示出listview的最后一行",Toast.LENGTH_SHORT).show();
loadMoreData();
}
});
}
}
//一个工具类
package com.bwie.myapplication123;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Created by Administrator on 2017/9/15.
*/
public class NetWorkUtil {
public String getJsonByHttpUrlConnection(String jsonUrl){
URL url = null;
HttpURLConnection httpURLConnection = null;
String jsonStr = "";
try {
url = new URL(jsonUrl);//创建URL对象,连接JSON_URL对应的服务器
httpURLConnection = (HttpURLConnection) url.openConnection();//打开连接
httpURLConnection.setConnectTimeout(5000);//设置请求时长为5秒
httpURLConnection.setReadTimeout(5000);//设置读取服务器响应数据的时长
int resCode = httpURLConnection.getResponseCode();//得到响应结果码
if(resCode == 200){//表示响应成功,可以获得相应的额结果
//得到响应的结果,,服务器响应的输入流
InputStream inputStream = httpURLConnection.getInputStream();
byte[] buffers = new byte[1024];
int length = 0;
while((length = inputStream.read(buffers)) != -1){//本次循环成立,说明读取到了数据
jsonStr += new String(buffers,0,length);
}
//循环完毕,读取数据完毕
Log.d("main",jsonStr);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return jsonStr;
}
}
在这里Ben我就不传了
接下来还有一个适配器
package com.bwie.myapplication123;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
public class MyBaseAdapter extends BaseAdapter {
private Context context;
private List<News.DataBean> newsList;
public MyBaseAdapter(Context context, List<News.DataBean> newsList) {
this.context = context;
this.newsList = newsList;
}
@Override
public int getCount() {
return newsList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if(convertView == null){
viewHolder = new ViewHolder();
convertView = View.inflate(context, R.layout.list_item, null);
viewHolder.newsName = (TextView) convertView.findViewById(R.id.newsname);
viewHolder.newsTime = (TextView) convertView.findViewById(R.id.newstime);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
//配置数据
News.DataBean dataBean = newsList.get(position);
viewHolder.newsName.setText(dataBean.getTITLE().substring(0,5));
viewHolder.newsTime.setText(dataBean.getSHOWTIME());
return convertView;
}
class ViewHolder{
TextView newsName,newsTime;
}
}
别忘了加权限<uses-permission android:name="android.permission.INTERNET"/>
阅读全文
1 0
- 实现XlistView的简洁方法PullToRefreshListView
- 自定义控件(PullToRefreshListView,XListView)的原理
- XListView+ PullToRefreshListView+ViewPager
- PullToRefreshListView 的简单实现
- xlistview用到的方法
- XListView的主方法
- xListView的主方法
- 实现文件拖放的一种简洁方法
- 实现文件拖放的一种简洁方法
- 实现文件拖放的一种简洁方法
- 实现文件拖放的一种简洁方法
- 实现文件拖放的一种简洁方法
- 实现文件拖放的一种简洁方法
- xlistview的实现
- PullToRefreshListView添加headView的方法
- pulltorefreshlistview 和xlistview 中的获取item控件布局时出现的类转换异常的问题:
- 安卓中PullToRefreshListview添加头部的方法
- 简洁的单链表实现
- 数据结构-双向循环链表
- jQuery DOM 元素方法
- CS229机器学习个人笔记(2)——Linear Regression with Multiple Variables
- Palindrome Linked List 回文链表
- QT渐变-QLinearGradient,QRadialGradient,QConicalGradient)
- 实现XlistView的简洁方法PullToRefreshListView
- ViewPager无限轮播+圆点+GridView数据展示
- getc和putc实现文件拷贝
- Oracle的Package的作用
- FOUNDATION_EXPORT 与#define 区别
- 博客申明
- strlen 和mb_strlen 的区别
- Pandas学习(三)——NBA球员薪资分析
- Servlet总结一