PullToRefresh下拉刷新和上拉加载
- 核心文件:PullToRefreshListView.java
- OnRefreshListener 监听刷新操作的接口
- onRefresh()刷新函数 在列表头部显示正在进行的刷新操作进度条
- onRefreshComplete() 刷新操作完成后,恢复列表常态
- pullToRefreshListView_main = (PullToRefreshListView) findViewById(R.id.pullToRefreshListView_main);
- listView_main = pullToRefreshListView_main.getRefreshableView();
- pullToRefreshListView_main.setOnLastItemVisibleListener();
- pullToRefreshListView_main.setOnRefreshListener();
5、刷新完成后恢复列表(使头部提示信息消失):
- pullToRefreshListView_main.onRefreshComplete();
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技术栈》