使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)

AsyncTask使用方法详情:http://www.cnblogs.com/zzw1994/p/4959949.html
下拉开源框架PullToRefresh使用方法和下载详情:http://www.cnblogs.com/zzw1994/p/4992194.html
具体实现的代码如下:
item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <ImageView
android:id="@+id/imageView1"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:src="@drawable/ic_launcher" /> <TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView1"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/imageView2"
android:layout_toRightOf="@+id/imageView1"
android:gravity="center"
android:text="TextView"
android:textColor="@android:color/holo_red_light"
android:textSize="30sp" /> <ImageView
android:id="@+id/imageView2"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_launcher" /> </RelativeLayout>
item.xml
activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.zzw.testpulltorefresh.MainActivity" > <com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </RelativeLayout>
activity_main.xml
MainActivity.java:
package com.zzw.testpulltorefresh; import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap; 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; import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity {
private int COUNT = 0; private final String IMAGE_KEY1 = "IMAGE_KEY1";
private final String IMAGE_KEY2 = "IMAGE_KEY2";
private final String TEXT_KEY = "TEXT_KEY"; private PullToRefreshListView listView;
private ArrayList<HashMap<String, Object>> data;
private ArrayAdapter adapter;
private String[] urls = { "http://p1.so.qhimg.com/bdr/_240_/t01829c584b50b68311.jpg",
"http://p2.so.qhimg.com/bdr/_240_/t011c2cd4fe8723bcb2.jpg",
"http://p4.so.qhimg.com/bdr/_240_/t01b11db3c0961b24a9.jpg",
"http://p4.so.qhimg.com/bdr/_240_/t019786092c7b1688b9.jpg",
"http://p4.so.qhimg.com/bdr/_240_/t015b226d64a10097ce.jpg",
"http://p1.so.qhimg.com/bdr/_240_/t01f6c4382c907133ab.jpg" }; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); data = new ArrayList<HashMap<String, Object>>(); listView = (PullToRefreshListView) findViewById(R.id.listView); // 设置向下滑动时刷新
listView.setMode(Mode.PULL_FROM_START);
// 支持下拉和上拉 listView.setMode(Mode.BOTH); // 设置监听
listView.setOnRefreshListener(new OnRefreshListener<ListView>() { @Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
// 在这完成业务逻辑
new MyAsyncTask().execute();
}
}); adapter = new MyAdapter(this, R.layout.item);
listView.setAdapter(adapter); // 设置如果数据为空的时候显示什么
TextView textView = new TextView(this);
textView.setText("请下拉刷新");
listView.setEmptyView(textView);
} //自定义的Item显示参数设置在Adapter中操作
private class MyAdapter extends ArrayAdapter { private LayoutInflater inflater;
private int item; public MyAdapter(Context context, int resource) {
super(context, resource);
inflater = LayoutInflater.from(context);
this.item = resource;
} @Override
public int getCount() {
return data.size();
} @Override
public HashMap<String, Object> getItem(int position) { return data.get(position);
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
HashMap<String, Object> map = getItem(position); if (convertView == null) {
convertView = inflater.inflate(item, null);
} ImageView image1 = (ImageView) convertView.findViewById(R.id.imageView1);
ImageView image2 = (ImageView) convertView.findViewById(R.id.imageView2);
TextView textView = (TextView) convertView.findViewById(R.id.textView); image1.setImageBitmap((Bitmap) map.get(IMAGE_KEY1));
image2.setImageBitmap((Bitmap) map.get(IMAGE_KEY2));
textView.setText(map.get(TEXT_KEY) + ""); if (position % 2 == 1) {
textView.setTextColor(Color.BLUE);
} return convertView;
} } //联网等一系列延时操作在AsyncTask中操作
private class MyAsyncTask extends AsyncTask { @Override
protected void onPreExecute() {
// 开始刷新
listView.setRefreshing();
} @Override
protected Object doInBackground(Object... params) {
HashMap<String, Object> map = new HashMap<String, Object>();
try {
byte[] buf = loadRawDataFromURL(urls[COUNT]);
BitmapFactory factory = new BitmapFactory();
Bitmap bitmap = factory.decodeByteArray(buf, 0, buf.length);
map.put(TEXT_KEY, "数据->" + COUNT);
map.put(IMAGE_KEY1, bitmap);
map.put(IMAGE_KEY2, bitmap);
} catch (Exception e) {
e.printStackTrace();
}
return map;
} @Override
protected void onPostExecute(Object result) { data.add(0,(HashMap<String, Object>) result);
adapter.notifyDataSetChanged(); // 设置标签
listView.setLastUpdatedLabel("最后更新新的时间:" + new Date()); // 刷新完成
listView.onRefreshComplete();
COUNT++;
if (COUNT >= urls.length) {
COUNT = 0;
}
Toast.makeText(getApplicationContext(), "加载成功", 0).show();
}
} // 通过URL读取字节数组
public static byte[] loadRawDataFromURL(String u) throws Exception {
URL url = new URL(u);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is); ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 缓存2KB
final int BUFFER_SIZE = 2 * 1024;
final int EOF = -1; int c;
byte[] buf = new byte[BUFFER_SIZE]; while (true) {
c = bis.read(buf);
if (c == EOF)
break; baos.write(buf, 0, c);
} conn.disconnect();
is.close(); byte[] b = baos.toByteArray();
baos.flush(); return b;
} }
使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)的更多相关文章
- 开启AsyncTask从网络加载图片
/*AsyncTask 异步任务即做一些简单的异步处理 :是handle与线程池的封装 * 第一个泛型:参数类型泛型 * 第二个泛型:更新进度泛型 * 第三个泛型:onProgressUpdate的返 ...
- 第三方开源框架的下拉刷新列表(QQ比较常用的)。
PullToRefreshListView是第三方开源框架下拉刷新列表,比较流行的QQ 微信等上面都在用. 下载地址(此开源框架于2013年后不再更新) 点此下载 package com.lixu.k ...
- Android的SwipeToDismiss第三方开源框架模拟QQ对话列表侧滑删除,置顶,将头像图片圆形化处理。
<Android SwipeToDismiss:左右滑动删除ListView条目Item> Android的SwipeToDismiss是github上一个第三方开源框架(github ...
- Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片
一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...
- IOS-常用第三方开源框架介绍
iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 时间:2015-05-06 16:43:34 阅读:533 评论:0 收藏:0 [点我收藏+] ...
- iOS开发-常用第三方开源框架介绍
iOS开发-常用第三方开源框架介绍 图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网 ...
- ListView或GridView的Adapter使用Glide加载图片异常
报错信息为:You must not call setTag() on a view Glide is targeting 原因就是View使用setTag后导致Glide之前请求的标记被清除,强制转 ...
- swift 异步加载图片(第三方框架ImageLoader)
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...
- iOS常用第三方开源框架和优秀开发者博客等
博客收藏iOS开发过程好的开源框架.开源项目.Xcode工具插件.Mac软件.文章等,会不断更新维护,希望对你们有帮助.如果有推荐或者建议,请到此处提交推荐或者联系我. 该文档已提交GitHub,点击 ...
随机推荐
- [Arduino] 外部中断
原文:http://www.arduino.cn/thread-2421-1-1.html 1.什么是中断? 试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得 ...
- Parallel.ForEach() 并行循环
现在的电脑几乎都是多核的,但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势. 微软的并行运算平台(Microsoft’s Parallel Computing ...
- iOS 全局竖屏 单个viewcontroller点击按钮支持横屏
问题描述:项目工程只支持竖屏,在播放器页面需要点击按钮进行横竖屏切换,并能根据手机的方向进行自动旋转 如图:只勾选了竖屏 解决方法:(主要是采用视图transform的原理 横屏时调整视频视图上的每个 ...
- C语言中的内存压缩技术
C语言中的内存压缩技术 前言 在整个研究生阶段我都在参与一个LTE协议栈实现的项目,在这个项目中,我们利用一个自己编写的有限状态机框架将协议栈中每一层实现为一个内核模块.我们知道,在编写内核代码时需要 ...
- linux服务监控脚本
配置需要监控的服务器 数组定义:host_ports=(host_name=host_port=uri_path)host_name为容易识别的服务器名称host_port为服务器ip和服务端口uri ...
- Ralink RT3290无线网卡驱动安装 (linux)
Ralink RT3290无线网卡驱动安装 (linux, 笔记备忘) 1. 设备信息查看无线网卡设备信息 # lspci : 2. 驱动下载http://pan.baidu.com/s/1sjsHN ...
- p39
; ========================================== ; pmtest2.asm ; 编译方法:nasm pmtest2.asm -o pmtest2.com ; ...
- React Native学习-将 'screen', 'window' or a view生成图片
https://github.com/facebook/react-native/commit/ac12f986899d8520527684438f76299675dc0daa 这是react-nat ...
- QTREE2 spoj 913. Query on a tree II 经典的倍增思想
QTREE2 经典的倍增思想 题目: 给出一棵树,求: 1.两点之间距离. 2.从节点x到节点y最短路径上第k个节点的编号. 分析: 第一问的话,随便以一个节点为根,求得其他节点到根的距离,然后对于每 ...
- UWP源码——Unit Test
之前我们讨论了涨姿势UWP的RSS数据源获取,以及作为文件存储到本地,再将数据转化成Model对象.这部分非UI的内容非常适合添加Unit Test.不涉及UI的话,UT写起来简单高效,很是值得投入一 ...