国庆技术博客之XListView的上拉刷新和下拉加载
XListView的上拉加载下拉刷新
今天我来跟大家分享一下XListView的上拉加载下拉刷新,在以后的开发中会经常用到,首先要先导入XListView源码,然后在布局文件中布局,定义一些控件,然后在MainActivity中定义一些全局变量,再找控件,定义一变量path=1, boolean flag=true;再调用加载数据的initData()方法,创建并设置适配器,设置上拉加载下拉刷新的一些状态,还有下拉刷新的时间,给XListView设置点击事件, onRefresh中如果flag为false就下拉刷新数据,刷新数据为最初数据,
XListView源码网址: http://www.jianshu.com/p/9c40c0968f4b
首先要导入源码
path=1;
调用异步加载数据的方法
initData()
@Override
public void onLoadMore() {
// 如果flag=true;就上拉加载数据
flag=true;
path++;
//调用异步加载数据的方法
initData();
//吐司
Toast.makeText(MainActivity.this, "path目前等于:"+path, 0).show();
//停止加载
xlv.stopLoadMore();
}
创建MyXListViewAdapter
适配器并优化
创建异步加载的方法在 doInBackground中调用加载网络数据的方法,在onPostExecute中刷新适配器并开启任务,在加载网络数据的方法中URL url = new URL("https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page="
+path);
Gson解析数据,做一个判断,如果fls为true就把json.getNewslist()拼接进去进行加载数据
else就走list=json.getNewslist();
if (flag) {
//list.addAll拼接
list.addAll(json.getNewslist());
} else {
list=json.getNewslist();
}
注意在清单文件中写网络权限,导入Gson架包,以下是全部代码
实现思路
XlistView:就是一个实现了上拉刷新,下拉加载的自定义控件,我们如果集成他,就可以很轻松实现这些效果
1.搭建XlistView的环境(拷贝资源:java代码,XML布局,strings资源,图片)
2.布局编写,初始化控件
3.初始化数据(一般网络的数据,进行解析封装到集合中,去使用)
4.相当于listVIew的使用,创建适配器,设置适配器等等,(此时效果不佳)
5.要进行XlistVIew设置下拉刷新,上拉加载的开启操作
6.设置XlistVIew设置下拉刷新,上拉加载的监听操作
7.编写下拉刷新,上拉加载的业务逻辑代码
8.关闭下拉刷新,上拉加载的业务逻辑
注意:如果你想把数据放到listVIew顶部,那么这个数据就放到集合的0的位置就可以了.
提示你改布局,不要动控件的ID,你直接改控件内容即可
MainActivity类
public class MainActivity extends Activity {
//全局变量
private List<NewsListData> list = new ArrayList<NewsListData>();
XListView xlv;
MyXListViewAdapter adapter;
int path = 1;
boolean flag=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找控件
xlv=(XListView) findViewById(R.id.xlv);
//调用异步加载数据的方法
initData();
//创建适配器
adapter=new MyXListViewAdapter();
//设置适配器
xlv.setAdapter(adapter);
//设置下拉刷新状态
xlv.setPullRefreshEnable(true);
//设置上拉加载状态
xlv.setPullLoadEnable(true);
//设置下拉刷新的时间
xlv.setRefreshTime("2017-10-18");
//XListView的点击
xlv.setXListViewListener(new IXListViewListener() {
@Override
public void onRefresh() {
//如果flag为false就下拉刷新数据
flag=false;
//刷新数据为最初数据
path=1;
//调用异步加载数据的方法
initData();
//吐司
Toast.makeText(MainActivity.this, "path目前等于:"+path, 0).show();
//停止刷新
xlv.stopRefresh();
}
@Override
public void onLoadMore() {
// 如果flag=true;就上拉加载数据
flag=true;
path++;
//调用异步加载数据的方法
initData();
//吐司
Toast.makeText(MainActivity.this, "path目前等于:"+path, 0).show();
//停止加载
xlv.stopLoadMore();
}
});
}
//创建适配器
public class MyXListViewAdapter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
if (list != null) {
return list.size();
}
return 0;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 优化
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(MainActivity.this,
R.layout.list_item, null);
holder = new ViewHolder();
holder.tv_ctime = (TextView) convertView
.findViewById(R.id.tv_ctime);
holder.tv_title = (TextView) convertView
.findViewById(R.id.tv_title);
holder.tv_description = (TextView) convertView
.findViewById(R.id.tv_description);
holder.tv_url = (TextView) convertView
.findViewById(R.id.tv_url);
holder.iv_picUrl = (ImageView) convertView
.findViewById(R.id.iv_picUrl);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_ctime.setText(list.get(position).getCtime());
holder.tv_title.setText(list.get(position).getTitle());
holder.tv_description.setText(list.get(position).getDescription());
holder.tv_url.setText(list.get(position).getUrl());
ImageLoader.getInstance().displayImage(list.get(position).getPicUrl(), holder.iv_picUrl);
return convertView;
}
}
//优化帮助类
private static class ViewHolder {
TextView tv_ctime, tv_title, tv_description, tv_url;
ImageView iv_picUrl;
}
//异步加载数据的方法
public void initData() {
new AsyncTask<String, String, String>() {
@Override
protected String doInBackground(String... params) {
// 调用 方法
getData();
return null;
}
@Override
protected void onPostExecute(String result) {
// 刷新适配器
adapter.notifyDataSetChanged();
super.onPostExecute(result);
}
}.execute();
}
//获取网络数据的方法
public void getData() {
try {
URL url = new URL(
"https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page="
+ path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
int code = conn.getResponseCode();
if (code == 200) {
//Gson解析
Gson gson = new Gson();
JsonData json = gson.fromJson(
new InputStreamReader(conn.getInputStream()),
JsonData.class);
//如果fls为true就把json.getNewslist()拼接进去进行加载数据
//else就走list=json.getNewslist();
if (flag) {
//list.addAll拼接
list.addAll(json.getNewslist());
} else {
list=json.getNewslist();
}
Log.i("+++++++++++++++++++++++", list+"");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Layout布局
<?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="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="30dp"
android:orientation="horizontal"
>
<TextView
android:id="@+id/tv_ctime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tv_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tv_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
<ImageView
android:id="@+id/iv_picUrl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>