Android40_PullToRefresh

PullToRefresh下拉刷新和上拉加载

一、PullToRefresh基础:
(一)、简介:
        在Android开发中有时我们需要访问网络实时刷新数据,比如QQ好友在线状态最新信息,QQ空间需要显示更多的好友动态信息,EOE论坛客户端显示更多的文章帖子信息等。android-pulltorefresh开源项目提供一个向下滑动即刷新列表的功能,将该项目稍作修改即可应用到自己的项目中。

1、下载地址 :
https://github.com/johannilsson/android-pulltorefresh 
该项目为 Android 应用提供一个向下滑动即刷新列表的功能。

2、工程组成 :
  • 核心文件:PullToRefreshListView.java
  • OnRefreshListener 监听刷新操作的接口 
  • onRefresh()刷新函数 在列表头部显示正在进行的刷新操作进度条
  • onRefreshComplete() 刷新操作完成后,恢复列表常态


(二)、ListView中使用PullToRefresh的步骤:【重要】

1、导入文件及其附属资源文件;
2、使用自定义的ListView控件:<包名.PullToRefreshListView>
3、初始化ListView控件:
  • pullToRefreshListView_main = (PullToRefreshListView) findViewById(R.id.pullToRefreshListView_main);
  • listView_main = pullToRefreshListView_main.getRefreshableView();
4、PullToRefreshListView设置监听器:
  • pullToRefreshListView_main.setOnLastItemVisibleListener();
  • pullToRefreshListView_main.setOnRefreshListener();

5、刷新完成后恢复列表(使头部提示信息消失):

  • pullToRefreshListView_main.onRefreshComplete();


二、《糗事百科》核心实例代码:Volley+PullToRefresh

1、核心代码:
 
   

public class MainActivity extends Activity {

private PullToRefreshListView pullToRefreshListView_main;

private ListView listView_main;

private RequestQueue mRequestQueue = null;

private String urlString = "http://m2.qiushibaike.com/article/list/suggest?page=";

private List<Map<String, Object>> totalList = null;

private MyAdapter myAdapter = null;

private int page = 1;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


// 第1步:初始化ListView控件

initView();


// 第 2 步:加载数据

loadData();

}


private void initView() {// 第1步:初始化ListView控件

// 创建RequestQueue

mRequestQueue = Volley.newRequestQueue(this);

pullToRefreshListView_main = (PullToRefreshListView) findViewById(R.id.pullToRefreshListView_main);

listView_main = pullToRefreshListView_main.getRefreshableView();

totalList = new ArrayList<Map<String, Object>>();

myAdapter = new MyAdapter(totalList, mRequestQueue);

listView_main.setAdapter(myAdapter);


pullToRefreshListView_main

.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {

@Override

public void onLastItemVisible() {

page++;

loadData();

}

});

pullToRefreshListView_main

.setOnRefreshListener(new OnRefreshListener() {

@Override

public void onRefresh() {

page = 1;

loadData();

}

});


}


private void loadData() {// 第 2 步:加载数据

StringRequest stringRequest = new StringRequest(urlString + page,

new Response.Listener<String>() {

@Override

public void onResponse(String response) {

if (response != null || "".equals(response)) {

List<Map<String, Object>> list = jsonStringToList(response);

if (list != null) {

totalList.addAll(list);

myAdapter.notifyDataSetChanged();

// 刷新完成后使头部提示信息消失

pullToRefreshListView_main.onRefreshComplete();

}

} else {

setTitle("网络异常!");

}

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

}

});


mRequestQueue.add(stringRequest);

}


class MyAdapter extends BaseAdapter {

private List<Map<String, Object>> list = null;

private ImageLoader imageLoader = null;


public MyAdapter(List<Map<String, Object>> list, RequestQueue queue) {

this.list = list;

imageLoader = new ImageLoader(queue, MyImageCache.getInstance());

}


@Override

public int getCount() {

return list.size();

}


@Override

public Object getItem(int position) {

return list.get(position);

}


@Override

public long getItemId(int position) {

return position;

}


@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder mHolder;

if (convertView == null) {

mHolder = new ViewHolder();

convertView = getLayoutInflater().inflate(

R.layout.item_listview_main, parent, false);

mHolder.textView_item_content = (TextView) convertView

.findViewById(R.id.textView_item_content);

mHolder.textView_item_commentcount = (TextView) convertView

.findViewById(R.id.textView_item_commentcount);

mHolder.textView_item_login = (TextView) convertView

.findViewById(R.id.textView_item_login);

mHolder.networkImageView_item_cover = (NetworkImageView) convertView

.findViewById(R.id.networkImageView_item_cover);

convertView.setTag(mHolder);

} else {

mHolder = (ViewHolder) convertView.getTag();

}

mHolder.textView_item_content.setText(list.get(position)

.get("content").toString());

mHolder.textView_item_commentcount.setText(list.get(position)

.get("comments_count").toString());

mHolder.textView_item_login.setText(list.get(position).get("login")

.toString());


// 第3步:开始异步加载图片

final String imgUrlString = getImageUrl(list.get(position)

.get("image").toString());

if (imgUrlString.equals("")) {

mHolder.networkImageView_item_cover

.setImageResource(R.drawable.empty);

} else {

mHolder.networkImageView_item_cover

.setDefaultImageResId(R.drawable.empty);

mHolder.networkImageView_item_cover

.setErrorImageResId(R.drawable.ic_launcher);

mHolder.networkImageView_item_cover.setImageUrl(imgUrlString,

imageLoader);


// 单击监听,实现打开大图

mHolder.networkImageView_item_cover

.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent();

intent.setClass(MainActivity.this,

BitmapshowActivity.class);

Bundle bundle = new Bundle();

bundle.putString("imgUrlString", imgUrlString);

intent.putExtras(bundle);

startActivity(intent);

}

});

}


return convertView;

}


class ViewHolder {

private NetworkImageView networkImageView_item_cover;

private TextView textView_item_content;

private TextView textView_item_login;

private TextView textView_item_commentcount;

}


}


// 根据json解析获取到的图片名称,生成该图片的url地址

private String getImageUrl(String imageName) {

String prefixUrlString = "http://pic.qiushibaike.com/system/pictures/";

Pattern pattern = Pattern.compile("(\\d{4})\\d+");

Matcher matcher = pattern.matcher(imageName);

StringBuilder url = new StringBuilder();

if (matcher.find()) {

url.append(prefixUrlString).append(matcher.group(1)).append('/')

.append(matcher.group(0)).append("/small/")

.append(imageName);

return url.toString();

} else {

return "";

}

}


private List<Map<String, Object>> jsonStringToList(String jsonString) {

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

try {

JSONObject jsonObject = new JSONObject(jsonString);


JSONArray jsonArray_items = jsonObject.getJSONArray("items");


for (int i = 0; i < jsonArray_items.length(); i++) {

JSONObject jsonObject_item = jsonArray_items.getJSONObject(i);


Map<String, Object> map = new HashMap<String, Object>();

map.put("image", jsonObject_item.getString("image"));

map.put("content", jsonObject_item.getString("content"));

map.put("comments_count",

jsonObject_item.getString("comments_count"));


JSONObject jsonObject_user = jsonObject_item

.optJSONObject("user");

if (jsonObject_user == null) {

map.put("login", "【 匿名 】");

} else {

map.put("login", "【 " + jsonObject_user.getString("login")

+ " 】");

}

list.add(map);

}

return list;

} catch (JSONException e) {

e.printStackTrace();

}

return null;

}


static class MyImageCache implements ImageCache {

private static LruCache<String, Bitmap> lruCache = null;

private static MyImageCache myImageCache = null;


private MyImageCache() {

int memorySize = (int) Runtime.getRuntime().maxMemory();

int lruCacheSize = memorySize / 8;

lruCache = new LruCache<String, Bitmap>(lruCacheSize) {

@Override

protected int sizeOf(String key, Bitmap value) {

return value.getRowBytes() * value.getHeight();

}

};

}


public static MyImageCache getInstance() {

if (myImageCache == null) {

myImageCache = new MyImageCache();

}

return myImageCache;

}


@Override

public Bitmap getBitmap(String url) {

return lruCache.get(url);

}


@Override

public void putBitmap(String url, Bitmap bitmap) {

lruCache.put(url, bitmap);

}

}


@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}


}

良心的公众号,更多精品文章,不要忘记关注哈

《Android和Java技术栈》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值