PullToRefresh实现下拉上拉刷新,xUtils开源库的运用

(1)先去下载开源库

https://github.com

(2)导包


(3)部分布局

<com.handmark.pulltorefresh.library.PullToRefreshListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

(4)核心代码

//测试的api

public interface Api {
	public static final String URI = "http://api.mishi.cn/homePage/goods/?_method=GET&p-pv=1.0&p-apiv=2.0&cityCode=020&pageSize=10&lng=113.340459¤tPage=%d&lat=23.175758&city=广州市";

	public static final String CLASSIFY_URI = "http://api.mishi.cn/categories/foreground/?_method=GET&p-pv=1.0&p-apiv=1.0";

}

public class MainActivity extends Activity {

	
	@ViewInject(R.id.listView)
	private PullToRefreshListView listView;

	private BitmapUtils bitmapUtils;
	private ContentAdapter adapter;
	private List<ResultList> totalList = new ArrayList<ResultList>();

	private int page = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		ViewUtils.inject(this);

		bitmapUtils = new BitmapUtils(this);
		adapter = new ContentAdapter(MainActivity.this, totalList, bitmapUtils);
		listView.setAdapter(adapter);

		setListView();

		download(1);

	}

	/**
	 * 设置PullToRefreshListView的属性
	 */
	private void setListView() {
		// 设置PullToRefreshListView添加上拉和下拉的方式
		listView.setMode(Mode.BOTH);// 现在是两种都用的情况

		// 在布局文件中通过添加属性(ptr:ptrAnimationStyle="rotate")控制加载图标的动画效果(旋转[rotate]
		// 翻转[flip])

		// 修改刷新布局的参数
		/*
		 * includeStart = true, includeEnd = false;表示获取下拉刷新的布局
		 * 
		 * includeStart = false, includeEnd = true;表示获取上拉刷新的布局
		 */
		ILoadingLayout freshLayout = listView
				.getLoadingLayoutProxy(true, false);

		// 修改更新的时间,可以用于提示上次刷新是什么时候
		freshLayout.setLastUpdatedLabel("上次更新2015.4.14");
		// 修改更新的旋转图标
		// freshLayout.setLoadingDrawable(getResources().getDrawable(R.drawable.ic_launcher));
		// 设置下拉的文字
		freshLayout.setPullLabel("下拉刷新");
		// 松开的提示语
		freshLayout.setReleaseLabel("松开刷新");
		// 设置刷新的文字提示
		freshLayout.setRefreshingLabel("正在刷新,请稍等...");
		// 设置字体格式
		// freshLayout.setTextTypeface(Typeface.DEFAULT);
               /**
<span style="white-space:pre">		</span> * 给PullToRefreshListView添加headView
<span style="white-space:pre">		</span> */
<span style="white-space:pre">		</span>// 获取PullToRefreshListView中的ListView
<span style="white-space:pre">		</span>/*ListView list = listView.getRefreshableView();
<span style="white-space:pre">		</span>//测试
<span style="white-space:pre">		</span>ImageView img = new ImageView(this);
<span style="white-space:pre">		</span>img.setImageResource(R.drawable.ic_launcher);
<span style="white-space:pre">		</span>list.addHeaderView(img);*/
		/**
		 * 为PullToRefreshListView绑定监听器监听用户的下拉和上拉操作
		 */
		listView.setOnRefreshListener(new OnRefreshListener2<ListView>() {

			@Override
			// 下拉刷新
			public void onPullDownToRefresh(PullToRefreshBase refreshView) {
				// 下拉刷新的逻辑代码
				/*
				 * 1、清空数据集合中的原有的所有的数据
				 * 
				 * 2、重新请求第一页数据,存入到数据集合中
				 * 
				 * 3、通知UI展示新数据(notifyDataSetChanged)
				 * 
				 * 4、通知刷新布局,数据加载完成
				 */

				// 1、清空数据集合中的原有的所有的数据
				totalList.clear();
				// 2、重新请求第一页数据,存入到数据集合中 3、通知UI展示新数据(notifyDataSetChanged)
				download(1);
				// 4、通知刷新布局,数据加载完成
				listView.onRefreshComplete();
			}

			@Override
			// 上拉加载
			public void onPullUpToRefresh(PullToRefreshBase refreshView) {
				// 上拉加载的逻辑代码
				/*
				 * 1、请求下一页数据
				 * 
				 * 2、添加到数据集合中
				 * 
				 * 3、通知UI展示新数据(notifyDataSetChanged)
				 * 
				 * 4、通知刷新布局,数据加载完成
				 */

				// 1、请求下一页数据
				page++;
				// 2、添加到数据集合中 3、通知UI展示新数据(notifyDataSetChanged)
				download(page);
				// 4、通知刷新布局,数据加载完成
				listView.onRefreshComplete();

			}
		});

	}

	/**
	 * 使用xUtils框架下载
	 */
	private void download(int page) {
		// 创建xUtils工具类中HttpUtils对象
		HttpUtils httpUtils = new HttpUtils();
		// 拼接完整链接
		String uri = String.format(Api.URI, page);
		// 发送请求
		httpUtils.send(HttpMethod.GET, uri, new RequestCallBack<String>() {

			@Override
			// 请求失败的处理
			public void onFailure(HttpException arg0, String arg1) {
				Toast.makeText(MainActivity.this, "网络异常", Toast.LENGTH_SHORT)
						.show();
			}

			@Override
			// 请求成功的处理
			public void onSuccess(ResponseInfo<String> info) {

				if (info.statusCode == 200) {
					String json = info.result;
					List<ResultList> list = ParJSON.getResultList(json);
					totalList.addAll(list);
					adapter.notifyDataSetChanged();

				} else {
					Toast.makeText(MainActivity.this, "数据获取失败",
							Toast.LENGTH_SHORT).show();
				}

			}
		});

	}
}

(5)listView中有两种不同的视图

public class ContentAdapter extends BaseAdapter {

	private static final int ALBUM = 0;
	private static final int GOODS = 1;

	private Context context;

	private List<ResultList> list;

	private BitmapUtils bitmapUtils;

	public ContentAdapter(Context con, List<ResultList> list,
			BitmapUtils bitmapUtils) {
		this.context = con;
		this.list = list;
		this.bitmapUtils = bitmapUtils;
	}

	@Override
	public int getCount() {
		return list.size();
	}

	@Override
	public Object getItem(int arg0) {
		return list.get(arg0);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public int getViewTypeCount() {
		return 2;
	}

	@Override
	public int getItemViewType(int position) {
		if (list.get(position).getType().equals("ALBUM")) {
			return ALBUM;
		}
		return GOODS;
	}

	@Override
	public View getView(int position, View view, ViewGroup parent) {
		ResultList rList = list.get(position);
		JSONObject content = null;
		try {
			content = new JSONObject(rList.getItemData());
		} catch (JSONException e) {
			e.printStackTrace();
		}

		int type = getItemViewType(position);
		switch (type) {
		case ALBUM:
			ViewAlbumItem va = null;
			if (view == null) {
				va = new ViewAlbumItem();
				view = LayoutInflater.from(context).inflate(R.layout.albumitem,
						null);
				va.mainTitle = (TextView) view.findViewById(R.id.mainTitle);
				va.subTitle = (TextView) view.findViewById(R.id.subTitle);
				va.img_album = (ImageView) view.findViewById(R.id.img_album);
				view.setTag(va);
			} else {
				va = (ViewAlbumItem) view.getTag();
			}
			AlbumItem ai = JSON
					.parseObject(content.toString(), AlbumItem.class);
			va.mainTitle.setText(ai.getMainTitle());
			va.subTitle.setText(ai.getSubTitle());

			bitmapUtils.display(va.img_album, ai.getCoverUrl());

			break;
		case GOODS:
			ViewGoodsItem vg = null;
			if (view == null) {
				vg = new ViewGoodsItem();
				view = LayoutInflater.from(context).inflate(R.layout.goodsitem,
						null);
				vg.chefIcon = (ImageView) view.findViewById(R.id.chefIcon);
				vg.img_goods = (ImageView) view.findViewById(R.id.img_goods);
				vg.name = (TextView) view.findViewById(R.id.name);
				vg.shopName = (TextView) view.findViewById(R.id.shopName);
				vg.distance = (TextView) view.findViewById(R.id.distance);
				vg.desc = (TextView) view.findViewById(R.id.desc);
				view.setTag(vg);
			} else {
				vg = (ViewGoodsItem) view.getTag();
			}

			GoodsItem gi = JSON
					.parseObject(content.toString(), GoodsItem.class);
			vg.desc.setText(gi.getDesc());
			vg.name.setText(gi.getName());

			try {
				JSONArray picList = new JSONArray(gi.getPicList());
				String url = picList.getJSONObject(0).getString("url");

				bitmapUtils.display(vg.img_goods, url);

			} catch (JSONException e) {
				e.printStackTrace();
			}

			try {
				JSONObject shop = new JSONObject(gi.getShop());
				vg.shopName.setText(shop.getString("shopName"));
				vg.distance.setText(shop.getString("distance"));

				bitmapUtils.display(vg.chefIcon, shop.getString("chefIcon"));

			} catch (JSONException e) {
				e.printStackTrace();
			}

			break;
		}

		return view;
	}

	public class ViewAlbumItem {
		private TextView mainTitle, subTitle;
		private ImageView img_album;
	}

	public class ViewGoodsItem {
		private ImageView img_goods, chefIcon;
		private TextView name, shopName, distance, desc;
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值