先说明下,本人刚学习android不满一个月,然后就被安排了弄出一个下拉刷新和上拉加载的demo,这段时间一直在看代码,看的头都大了。还好找到了巨人们的肩膀,帮了我一个大忙,为了不使这几天的辛苦白费,赶紧来写下来以便以后参考。
首先谢谢这位博主的文章,链接http://blog.csdn.net/ueryueryuery/article/details/17440465。正是这一篇文章,解决了原来的Android-PullToRefresh项目里不能上拉加载的问题。
其次,再谢谢老罗的视频吧,解决了我从数据库里面刷新数据的困难,推荐大家去看看。
package com.handmark.pulltorefresh.samples;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.format.DateUtils;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
/**
* @author weaver 2014-7-28
* @version
*/
public final class PullToRefreshListActivity extends ListActivity {
//需要自定义一个view,因为普通的ListView是无法实现上拉或者下拉的操作的
private PullToRefreshListView mPullRefreshListView;
//listItem
private ArrayList<HashMap<String, Object>> listItem;
//listItem的适配器
private SimpleAdapter listItemAdapter;
//服务器返回的字符串
private String[] dataStrings = null;
private String[] newsTitle = new String[10];
private String[] newsTime = new String[10];
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ptr_list);
mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
//设置mPullRefreshListView的模式,表示上拉和下拉都可以
mPullRefreshListView.setMode(Mode.BOTH);
//设置上拉时显示的字
mPullRefreshListView.getLoadingLayoutProxy(false, true).setPullLabel(getString(R.string.pull_to_load));
mPullRefreshListView.getLoadingLayoutProxy(false, true).setRefreshingLabel(getString(R.string.loading));
mPullRefreshListView.getLoadingLayoutProxy(false, true).setReleaseLabel(getString(R.string.release_to_load));
// 刷新时执行的操作
mPullRefreshListView
.setOnRefreshListener(new OnRefreshListener<ListView>() {
@Override
public void onRefresh(
PullToRefreshBase<ListView> refreshView) {
//刷新时显示刷新的时间的label
String label = DateUtils.formatDateTime(
getApplicationContext(),
System.currentTimeMillis(),
DateUtils.FORMAT_SHOW_TIME
| DateUtils.FORMAT_SHOW_DATE
| DateUtils.FORMAT_ABBREV_ALL);
// Update the LastUpdatedLabel
refreshView.getLoadingLayoutProxy()
.setLastUpdatedLabel(label);
// Do work to refresh the list here.
if(refreshView.isHeaderShown()){
//下拉刷新,自定义的操作可以添加在这
new GetDataTask().execute();
}else{
//上拉加载更多,自定义的操作可以添加在这
new GetDataTaskFromLocal().execute() ;
}
}
});
listItem = new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < 10; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemTitle", "求人不如求己" + i);
map.put("ItemTime", "2014-07-2" + i);
listItem.add(0, map);
}
listItemAdapter = new SimpleAdapter(this, listItem,// 数据源
R.layout.list_items,// ListItem的XML实现
// 动态数组与ImageItem对应的子项
new String[] { "ItemTitle", "ItemTime" },
// ImageItem的XML文件里面的一个ImageView,两个TextView ID
new int[] { R.id.ItemTitle, R.id.ItemTime });
// 添加并且显示
mPullRefreshListView.setAdapter(listItemAdapter);
}
/**
* @author weaver 2014-7-30
* @version 下拉刷新异步任务AsynTask
*/
private class GetDataTask extends AsyncTask<Void, Void, Void> {
/*
* 后台进程 ,连接服务器,刷新listview
*/
@Override
protected Void doInBackground(Void... params) {
try {
Map<String, String> param = new HashMap<String, String>();
param.put("username", "admin");
param.put("password", "123");
String result = HttpUtils.sendPostMessage(param, "utf-8");
dataStrings = result.split("\n");
for (int i = 0, j = 0; i < dataStrings.length; i += 2, j++) {
newsTitle[j] = dataStrings[i];
newsTime[j] = dataStrings[i + 1];
}
Thread.sleep(1000);
} catch (InterruptedException e) {
}
return null;
}
protected void onPostExecute(Void result) {
for (int i = 0; i < newsTime.length; i++) {
if ((newsTitle[i] != null) && (newsTime[i] != null)) {
HashMap<String, Object> mymap = new HashMap<String, Object>();
mymap.put("ItemTitle", newsTitle[i]);
mymap.put("ItemTime", newsTime[i]);
listItem.add(0, mymap);
}
}
// 通知adapter数据刷新
listItemAdapter.notifyDataSetChanged();
// 通知刷新完成.
mPullRefreshListView.onRefreshComplete();
super.onPostExecute(result);
}
}
/**
* 上拉加载更多异步任务
* @author weaver
* 2014-7-31
* @version
*/
private class GetDataTaskFromLocal extends AsyncTask<Void, Void, Void> {
/*
* 后台进程 ,连接服务器,刷新listview
*/
@Override
protected Void doInBackground(Void... params) {
try {
Map<String, String> param = new HashMap<String, String>();
param.put("username", "admin");
param.put("password", "123");
String result = HttpUtils.sendPostMessage(param, "utf-8");
dataStrings = result.split("\n");
for (int i = 0, j = 0; i < dataStrings.length; i += 2, j++) {
newsTitle[j] = dataStrings[i];
newsTime[j] = dataStrings[i + 1];
}
Thread.sleep(1000);
} catch (InterruptedException e) {
}
return null;
}
protected void onPostExecute(Void result) {
for (int i = 0; i < newsTime.length; i++) {
if ((newsTitle[i] != null) && (newsTime[i] != null)) {
HashMap<String, Object> mymap = new HashMap<String, Object>();
mymap.put("ItemTitle", newsTitle[i]);
mymap.put("ItemTime", newsTime[i]);
listItem.add(mymap);
}
}
// 通知adapter数据刷新
listItemAdapter.notifyDataSetChanged();
// 通知刷新完成.
mPullRefreshListView.onRefreshComplete();
super.onPostExecute(result);
}
}
}
其他的xml文件都比较简单,就不贴上来了。(由于刚学习,还不会使用json啥的,导致处理数据有点丑。。。。)