您的位置:首页 > 理论基础 > 计算机网络

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:

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
*
@authorriddlezhang歌曲条目适配器
13
*/
14
public
class
SongListAdapter
extends
BaseAdapter
{
15
private
static
final
String
TAG=
"SongListAdapter"
;
16
private
Context
mContext;
17
private
String[]
strings={
"王力宏"
,
"吴尊"
,
"何润东"
,
"金城武"
,
"吴彦祖"
};
18
private
String[]
paths={
"http://list.image.baidu.com/t/image_category/galleryimg/menstar/hk/wang_li_hong.jpg"
,
19
"http://list.image.baidu.com/t/image_category/galleryimg/menstar/hk/wu_zun.jpg"
,
20
"http://list.image.baidu.com/t/image_category/galleryimg/menstar/hk/he_run_dong.jpg"
,
21
"http://list.image.baidu.com/t/image_category/galleryimg/menstar/hk/jin_cheng_wu.jpg"
,
22
"http://list.image.baidu.com/t/image_category/galleryimg/menstar/hk/wu_yan_zu.jpg"
};
23
public
SongListAdapter(Context
mContext){
24
this
.mContext
=mContext;
25
}
26
27
public
void
setmContext(Context
mContext){
28
this
.mContext
=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,
ViewconvertView,ViewGroupparent){
44
convertView
=LayoutInflater.from(mContext).inflate(R.layout.lv_adapter,
null
);
45
ImageView
image=(ImageView)convertView.findViewById(R.id.image);
46
TextView
songer=(TextView)convertView.findViewById(R.id.songer);
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
}
view
sourceprint?

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
*
@authorriddlezhang
16
*
异步加载图片
17
*/
18
public
class
AsyncViewTask
extends
AsyncTask<View,
Void,Drawable>{
19
private
View
mView;
20
protected
Drawable
doInBackground(View...views){
21
Drawable
drawable=
null
;
22
View
view=views[
0
];
23
if
(view.getTag()
!=
null
)
{
24
try
{
25
if
(URLUtil.isHttpUrl(view.getTag().toString()))
{
//如果为网络地址。则连接url下载图片
26
URL
url=
new
URL(view.getTag().toString());
27
HttpURLConnection
conn=(HttpURLConnection)url.openConnection();
28
conn.setDoInput(
true
);
29
conn.connect();
30
InputStream
stream=conn.getInputStream();
31
drawable
=Drawable.createFromStream(stream,
"src"
);
32
stream.close();
33
}
else
{
//如果为本地数据,直接解析
34
drawable
=Drawable.createFromPath(view.getTag().toString());
35
}
36
}
catch
(Exception
e){
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
drawable){
46
if
(drawable
!=
null
)
{
47
this
.mView.setBackgroundDrawable(drawable);
48
this
.mView=
null
;
49
}
50
}
51
52
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: