您的位置:首页 > 移动开发 > Android开发

采用github上的开源项目Android-PullToRefresh实现ListView的下拉刷新和上拉加载

2014-07-31 15:14 876 查看
先说明下,本人刚学习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啥的,导致处理数据有点丑。。。。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐