(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;
}
}