LISTVIEW动态加载网络数据2
2011-10-14 15:12
435 查看
写的有点乱,但是写的挺好的。
转自:/article/6980298.html
总体框架:
1.滚动加载
listView.setOnScrollListener(newOnScrollListener() {
//添加滚动条滚到最底部,加载余下的元素
@Override
publicvoidonScrollStateChanged(AbsListView
view,intscrollState) {
if(scrollState==OnScrollListener.SCROLL_STATE_IDLE) {
loadRemnantListItem();
}
}
@Override
publicvoidonScroll(AbsListView
view,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount) {}
});
listView.setOnItemSelectedListener(newOnItemSelectedListener() {
//按键选择List中的item,焦点落在最下面的view上加载余下的item
@Override
publicvoidonItemSelected(AdapterView<?>parent,
Viewview,intposition,longid) {
if(footerView==view) {
loadRemnantListItem();
listView.setSelection(position-1);
}
}
@Override
publicvoidonNothingSelected(AdapterView<?>parent) {}
});
privatevoidloadRemnantListItem() {//滚到加载余下的数据
//动态的改变listAdapter.getCount()的返回值
//使用Handler调用listAdapter.notifyDataSetChanged();更新数据
}
2.滚动翻页
//listView监听器代码相同
privatevoidloadRemnantListItem() {//滚到加载余下的数据
//重新listView.setAdapter(newsAdapter);
//使用Handler调用listAdapter.notifyDataSetChanged();更新数据
}
注:在listView最下面可以使用listView.addFooterView(footerView,null,true);来显示“加载中...”等的字样来美化用户体验,在loadRemnantListItem()方法中动态控制“加载中...”的显示和不显示。
具体例子1:
ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户等待下去,下面就说实现方法,先贴上主方法的代码:
packagecn.wangmeng.test;
importJava.io.IOException;
importjava.io.InputStream;
importjava.lang.ref.SoftReference;
importjava.NET.MalformedURLException;
importjava.net.URL;
importjava.util.HashMap;
importAndroid.graphics.drawable.Drawable;
importandroid.os.Handler;
importandroid.os.Message;
publicclassAsyncImageLoader{
privateHashMap<String,SoftReference<Drawable>>imageCache;
publicAsyncImageLoader(){
imageCache=newHashMap<String,SoftReference<Drawable>>();
}
publicDrawableloadDrawable(finalStringimageUrl,finalImageCallbackimageCallback){
if(imageCache.containsKey(imageUrl)){
SoftReference<Drawable>softReference=imageCache.get(imageUrl);
Drawabledrawable=softReference.get();
if(drawable!=null){
returndrawable;
}
}
finalHandlerhandler=newHandler(){
publicvoidhandleMessage(Messagemessage){
imageCallback.imageLoaded((Drawable)message.obj,imageUrl);
}
};
newThread(){
@Override
publicvoidrun(){
Drawabledrawable=loadImageFromUrl(imageUrl);
imageCache.put(imageUrl,newSoftReference<Drawable>(drawable));
Messagemessage=handler.obtainMessage(0,drawable);
handler.sendMessage(message);
}
}.start();
returnnull;
}
publicstaticDrawableloadImageFromUrl(Stringurl){
URLm;
InputStreami=null;
try{
m=newURL(url);
i=(InputStream)m.getContent();
}catch(MalformedURLExceptione1){
e1.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
Drawabled=Drawable.createFromStream(i,"src");
returnd;
}
publicinterfaceImageCallback{
publicvoidimageLoaded(DrawableimageDrawable,StringimageUrl);
}
}
以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。
ViewCache是辅助获取adapter的子元素布局
packagecn.wangmeng.test;
importjava.util.List;
importcn.wangmeng.test.AsyncImageLoader.ImageCallback;
importandroid.app.Activity;
importandroid.graphics.drawable.Drawable;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ArrayAdapter;
importandroid.widget.ImageView;
importandroid.widget.ListView;
importandroid.widget.TextView;
publicclassImageAndTextListAdapterextendsArrayAdapter<ImageAndText>{
privateListViewlistView;
privateAsyncImageLoaderasyncImageLoader;
publicImageAndTextListAdapter(Activityactivity,List<ImageAndText>imageAndTexts,ListViewlistView){
super(activity,0,imageAndTexts);
this.listView=listView;
asyncImageLoader=newAsyncImageLoader();
}
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
Activityactivity=(Activity)getContext();
//InflatetheviewsfromXML
ViewrowView=convertView;
ViewCacheviewCache;
if(rowView==null){
LayoutInflaterinflater=activity.getLayoutInflater();
rowView=inflater.inflate(R.layout.image_and_text_row,null);
viewCache=newViewCache(rowView);
rowView.setTag(viewCache);
}else{
viewCache=(ViewCache)rowView.getTag();
}
ImageAndTextimageAndText=getItem(position);
//LoadtheimageandsetitontheImageView
StringimageUrl=imageAndText.getImageUrl();
ImageViewimageView=viewCache.getImageView();
imageView.setTag(imageUrl);
DrawablecachedImage=asyncImageLoader.loadDrawable(imageUrl,newImageCallback(){
publicvoidimageLoaded(DrawableimageDrawable,StringimageUrl){
ImageViewimageViewByTag=(ImageView)listView.findViewWithTag(imageUrl);
if(imageViewByTag!=null){
imageViewByTag.setImageDrawable(imageDrawable);
}
}
});
if(cachedImage==null){
imageView.setImageResource(R.drawable.default_image);
}else{
imageView.setImageDrawable(cachedImage);
}
//SetthetextontheTextView
TextViewtextView=viewCache.getTextView();
textView.setText(imageAndText.getText());
returnrowView;
}
}
ImageAndTextListAdapter是实现ListView的Adapter,里面有个技巧就是imageView.setTag(imageUrl),setTag是存储数据的,这样是为了保证在回调函数时,listview去更新自己对应item,大家仔细阅读就知道了。
具体例子2:
view
sourceprint?
转自:
总体框架:
1.滚动加载
listView.setOnScrollListener(newOnScrollListener() {
//添加滚动条滚到最底部,加载余下的元素
@Override
publicvoidonScrollStateChanged(AbsListView
view,intscrollState) {
if(scrollState==OnScrollListener.SCROLL_STATE_IDLE) {
loadRemnantListItem();
}
}
@Override
publicvoidonScroll(AbsListView
view,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount) {}
});
listView.setOnItemSelectedListener(newOnItemSelectedListener() {
//按键选择List中的item,焦点落在最下面的view上加载余下的item
@Override
publicvoidonItemSelected(AdapterView<?>parent,
Viewview,intposition,longid) {
if(footerView==view) {
loadRemnantListItem();
listView.setSelection(position-1);
}
}
@Override
publicvoidonNothingSelected(AdapterView<?>parent) {}
});
privatevoidloadRemnantListItem() {//滚到加载余下的数据
//动态的改变listAdapter.getCount()的返回值
//使用Handler调用listAdapter.notifyDataSetChanged();更新数据
}
2.滚动翻页
//listView监听器代码相同
privatevoidloadRemnantListItem() {//滚到加载余下的数据
//重新listView.setAdapter(newsAdapter);
//使用Handler调用listAdapter.notifyDataSetChanged();更新数据
}
注:在listView最下面可以使用listView.addFooterView(footerView,null,true);来显示“加载中...”等的字样来美化用户体验,在loadRemnantListItem()方法中动态控制“加载中...”的显示和不显示。
具体例子1:
ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户等待下去,下面就说实现方法,先贴上主方法的代码:
packagecn.wangmeng.test;
import
importjava.io.InputStream;
importjava.lang.ref.SoftReference;
importjava
importjava.net.URL;
importjava.util.HashMap;
import
importandroid.os.Handler;
importandroid.os.Message;
publicclassAsyncImageLoader{
privateHashMap<String,SoftReference<Drawable>>imageCache;
publicAsyncImageLoader(){
imageCache=newHashMap<String,SoftReference<Drawable>>();
}
publicDrawableloadDrawable(finalStringimageUrl,finalImageCallbackimageCallback){
if(imageCache.containsKey(imageUrl)){
SoftReference<Drawable>softReference=imageCache.get(imageUrl);
Drawabledrawable=softReference.get();
if(drawable!=null){
returndrawable;
}
}
finalHandlerhandler=newHandler(){
publicvoidhandleMessage(Messagemessage){
imageCallback.imageLoaded((Drawable)message.obj,imageUrl);
}
};
newThread(){
@Override
publicvoidrun(){
Drawabledrawable=loadImageFromUrl(imageUrl);
imageCache.put(imageUrl,newSoftReference<Drawable>(drawable));
Messagemessage=handler.obtainMessage(0,drawable);
handler.sendMessage(message);
}
}.start();
returnnull;
}
publicstaticDrawableloadImageFromUrl(Stringurl){
URLm;
InputStreami=null;
try{
m=newURL(url);
i=(InputStream)m.getContent();
}catch(MalformedURLExceptione1){
e1.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
Drawabled=Drawable.createFromStream(i,"src");
returnd;
}
publicinterfaceImageCallback{
publicvoidimageLoaded(DrawableimageDrawable,StringimageUrl);
}
}
以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到
ViewCache是辅助获取adapter的子元素布局
packagecn.wangmeng.test;
importjava.util.List;
importcn.wangmeng.test.AsyncImageLoader.ImageCallback;
importandroid.app.Activity;
importandroid.graphics.drawable.Drawable;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ArrayAdapter;
importandroid.widget.ImageView;
importandroid.widget.ListView;
importandroid.widget.TextView;
publicclassImageAndTextListAdapterextendsArrayAdapter<ImageAndText>{
privateListViewlistView;
privateAsyncImageLoaderasyncImageLoader;
publicImageAndTextListAdapter(Activityactivity,List<ImageAndText>imageAndTexts,ListViewlistView){
super(activity,0,imageAndTexts);
this.listView=listView;
asyncImageLoader=newAsyncImageLoader();
}
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
Activityactivity=(Activity)getContext();
//InflatetheviewsfromXML
ViewrowView=convertView;
ViewCacheviewCache;
if(rowView==null){
LayoutInflaterinflater=activity.getLayoutInflater();
rowView=inflater.inflate(R.layout.image_and_text_row,null);
viewCache=newViewCache(rowView);
rowView.setTag(viewCache);
}else{
viewCache=(ViewCache)rowView.getTag();
}
ImageAndTextimageAndText=getItem(position);
//LoadtheimageandsetitontheImageView
StringimageUrl=imageAndText.getImageUrl();
ImageViewimageView=viewCache.getImageView();
imageView.setTag(imageUrl);
DrawablecachedImage=asyncImageLoader.loadDrawable(imageUrl,newImageCallback(){
publicvoidimageLoaded(DrawableimageDrawable,StringimageUrl){
ImageViewimageViewByTag=(ImageView)listView.findViewWithTag(imageUrl);
if(imageViewByTag!=null){
imageViewByTag.setImageDrawable(imageDrawable);
}
}
});
if(cachedImage==null){
imageView.setImageResource(R.drawable.default_image);
}else{
imageView.setImageDrawable(cachedImage);
}
//SetthetextontheTextView
TextViewtextView=viewCache.getTextView();
textView.setText(imageAndText.getText());
returnrowView;
}
}
ImageAndTextListAdapter是实现ListView的Adapter,里面有个技巧就是imageView.setTag(imageUrl),setTag是存储数据的,这样是为了保证在回调函数时,listview去更新自己对应item,大家仔细阅读就知道了。
具体例子2:
01 | package cn.riddles.activity; |
02 |
03 | import android.app.Activity; |
04 | import android.os.Bundle; |
05 | import android.widget.ListView; |
06 |
07 | public class MainActivity extends Activity { |
08 | private ListView lv; |
09 | @Override |
10 | public void onCreate(Bundle savedInstanceState){ |
11 | super .onCreate(savedInstanceState); |
12 | setContentView(R.layout.main); |
13 | lv =(ListView) this .findViewById(R.id.test_lv); |
14 | lv.setAdapter( new SongListAdapter( this )); |
15 | } |
16 | } |
01 | package cn.riddles.activity; |
02 |
03 | import android.content.Context; |
04 | import android.util.Log; |
05 | import android.view.LayoutInflater; |
06 | import android.view.View; |
07 | import android.view.ViewGroup; |
08 | import android.widget.BaseAdapter; |
09 | import android.widget.ImageView; |
10 | import android.widget.TextView; |
11 | /** |
12 | * |
13 | */ |
14 | public class SongListAdapter extends BaseAdapter { |
15 | private static final String "SongListAdapter" ; |
16 | private Context mContext; |
17 | private String[] "王力宏" , "吴尊" , "何润东" , "金城武" , "吴彦祖" }; |
18 | private String[] " , |
19 | " , |
20 | " , |
21 | " , |
22 | " }; |
23 | public SongListAdapter(Context |
24 | this .mContext |
25 | } |
26 |
27 | public void setmContext(Context |
28 | this .mContext |
29 | } |
30 |
31 | public int getCount() { |
32 | return paths.length; |
33 | } |
34 |
35 | public Object getItem( int position) { |
36 | return position; |
37 | } |
38 |
39 | public long getItemId( int position) { |
40 | return position; |
41 | } |
42 |
43 | public View getView( int position, |
44 | convertView null ); |
45 | ImageView |
46 | TextView |
47 | image.setTag(paths[position]); |
48 | songer.setText(strings[position]); |
49 | new CanvasImageTask().execute(image); //异步加载图片 |
50 | Log.i(TAG, "execute:" +strings[position]); |
51 | return convertView; |
52 | } |
53 |
54 | } |
source
01 | package cn.riddles.activity; |
02 |
03 | import java.io.InputStream; |
04 | import java.net.HttpURLConnection; |
05 | import java.net.URL; |
06 |
07 | import android.graphics.drawable.Drawable; |
08 | import android.os.AsyncTask; |
09 | import android.util.Log; |
10 | import android.view.View; |
11 | import android.webkit.URLUtil; |
12 |
13 |
14 | /** |
15 | * |
16 | * 异步加载图片 |
17 | */ |
18 | public class AsyncViewTask extends AsyncTask<View, |
19 | private View mView; |
20 | protected Drawable |
21 | Drawable null ; |
22 | View view=views[ 0 ]; |
23 | if (view.getTag() null ) { |
24 | try { |
25 | if (URLUtil.isHttpUrl(view.getTag().toString())) { //如果为网络地址。则连接url下载图片 |
26 | URL new URL(view.getTag().toString()); |
27 | HttpURLConnection |
28 | conn.setDoInput( true ); |
29 | conn.connect(); |
30 | InputStream |
31 | drawable "src" ); |
32 | stream.close(); |
33 | } else { //如果为本地数据,直接解析 |
34 | drawable |
35 | } |
36 | } catch (Exception |
37 | Log.v( "img" , e.getMessage()); |
38 | return null ; |
39 | } |
40 | } |
41 | this .mView=view; |
42 | return drawable; |
43 | } |
44 |
45 | protected void onPostExecute(Drawable |
46 | if (drawable null ) { |
47 | this .mView.setBackgroundDrawable(drawable); |
48 | this .mView= null ; |
49 | } |
50 | } |
51 |
52 | } |
相关文章推荐
- ListView动态加载网络数据的解决办法
- LISTVIEW动态加载网络数据2
- Listview动态加载网络数据
- Listview动态加载网络数据Activity大概实现
- ExpandableListView 实现点击某个group的时候再去请求网络动态加载子视图中的数据
- ListView异步加载网络数据
- Android中ListView动态加载数据 加载中 .
- Android_ListView_Adapter使用和数据动态加载
- (小笔记)popupwindow中listview加载的网络数据有时显示有时不显示
- Listview动态加载数据
- Android列表组件ListView使用详解之动态加载或修改列表数据
- ListView动态加载数据
- 从网络上异步加载数据,显示到ListView上
- viewpager动态加载listView数据
- ListView动态加载数据模板(使用代码布局)
- ExpandableListView网络加载数据
- 一步一步实现ListView加载网络数据,下滑底部加载,顶部下拉刷新。并配有双缓存
- Listview动态加载数据
- Listview动态加载数据
- 【Android动态布局】之【ListView动态加载数据】