[求助]GridView载入过慢问题

youx 2011-08-29 06:05:03
要实现功能如下图:

问题:用GridView做了一个2*X的影片列表,但是只要VideoBean列表>1时,getView方法会自动重复调用20多次才能完成加载,导致page2画面要等差不多30S才能显示,为什么getView要重复调用这么多次?

// 设定gView的Adapter为自定义的VideoAdapter
GridView gView = (GridView) findViewById(R.id.myGrid);
gView.setAdapter(new VideoAdapter(this, videoBeans, path));

/* 自定义的Adapter,继承android.widget.BaseAdapter */
public class VideoAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<VideoBean> items;
private String filePath;

public VideoAdapter(Context context, List<VideoBean> it, String path) {
mInflater = LayoutInflater.from(context);
items = it;
filePath = path;
}

/* 因继承BaseAdapter,需重写以下method */
@Override
public int getCount() {
return items.size();
}

@Override
public Object getItem(int position) {
return items.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View conView, ViewGroup par) {
ViewHolder holder;

if (conView == null) {
/* 使用自定义的video_view作为Layout */
conView = mInflater.inflate(R.layout.video_view, null);
// /* 初始化holder */
holder = new ViewHolder();
holder.image = (ImageView) conView.findViewById(R.id.videoImage);
holder.info = (TextView) conView.findViewById(R.id.videoInfo);
holder.size = (TextView) conView.findViewById(R.id.videoSize);
holder.videoPlay = (ImageView) conView.findViewById(R.id.playImage);
conView.setTag(holder);
} else {
holder = (ViewHolder) conView.getTag();
}
// /* 设定名称 */
VideoBean videoBean = (VideoBean) items.get(position);
if (!videoBean.isBlankBean()) {
holder.info.setText("简介: " + videoBean.getVideoInfo());
holder.size.setText("片长: " + videoBean.getVideoSize());
holder.videoPlay.setOnClickListener(new ButtonListener());
} else {
holder.videoPlay.setVisibility(View.INVISIBLE);
}

// 划出表格线
LinearLayout linL = (LinearLayout)conView.findViewById(R.id.linL);
System.out.println("===========GridView line start======================");
System.out.println("position = " + position);
System.out.println("===========GridView line end=========================");
int id = position;
if (id == 0) {
setPadding(linL, 1);
}else if(id == 1) {
setPadding(linL, 2);
}else {
if (id % 2 == 0) {
setPadding(linL, 3);
} else {
setPadding(linL, 4);
}
}

if (!videoBean.isBlankBean()) {
/* 设定照片 */
URL url;
try {
url = new URL(filePath + videoBean.getId()
+ "."
+ videoBean.getPicType());
URLConnection conn = url.openConnection();
conn.connect();
Bitmap bm = BitmapFactory.decodeStream(conn.getInputStream());
holder.image.setImageBitmap(bm);
} catch (Exception e) {
e.printStackTrace();
}
}
return conView;
}

private void setPadding(LinearLayout linL, int lineType){
switch (lineType) {
case 1: linL.setPadding(1, 1, 1, 1);break;
case 2: linL.setPadding(0, 1, 1, 1);break;
case 3: linL.setPadding(1, 0, 1, 1);break;
case 4: linL.setPadding(0, 0, 1, 1);break;
case 5: linL.setPadding(1, 0, 1, 1);break;
case 6: linL.setPadding(0, 0, 1, 1);break;
}
}

class ButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
}

private class ViewHolder {
ImageView image;
TextView size;
TextView info;
ImageView videoPlay;
}

// 设置GridView的网格项不会触发onChick事件
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}

video_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@color/darkgray"
>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linL"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@color/darkgray"
>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="@color/white"
>
<TableRow>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="2dip"
android:paddingTop="5dip"
android:paddingBottom="5dip"
>
<ImageView android:id="@+id/videoImage"
android:layout_width="150dip"
android:layout_height="140dip"
/>
<ImageView
android:id="@+id/playImage"
android:layout_width="30dip"
android:layout_height="30dip"
android:layout_gravity="center_vertical|center_horizontal"
android:src="@drawable/video"
/>
</FrameLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingTop="10dip"
android:paddingBottom="10dip"
>
<TextView android:id="@+id/videoInfo"
android:layout_width="150dip"
android:layout_weight="1.0"
android:layout_height="wrap_content"
android:gravity="left"
android:textSize="12sp"
android:paddingLeft="3dip"
android:textColor="@color/black"
/>
<TextView android:id="@+id/videoSize"
android:layout_width="fill_parent"
android:layout_weight="0.0"
android:layout_height="wrap_content"
android:gravity="bottom"
android:textSize="12sp"
android:paddingLeft="3dip"
android:textColor="@color/black"
/>
</LinearLayout>
</TableRow>
</TableLayout>
</LinearLayout>
</LinearLayout>

...全文
616 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bright_java 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mylzc 的回复:]
刚才说的是listview。。不过gridview同理
[/Quote]


同理吗?gridview发放调用多次是正常的。一句话这里调用gridview的次数是不确定。
youx 2011-09-08
  • 打赏
  • 举报
回复
设了个全局变量让重复调用时不调用取图片方法。为什么重复还是没解决..
mylzc 2011-08-30
  • 打赏
  • 举报
回复
else {
holder.videoPlay.setVisibility(View.INVISIBLE);
}

你把这段注释掉看看
youx 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mylzc 的回复:]

getview()中的这段代码会阻塞界面线程,导致界面卡死
url = new URL(filePath + videoBean.getId()
+ "."
+ videoBean.getPicType());
URLConnection conn = url.openConnection()……
[/Quote]
注释掉这段获取图片的代码,只保留holder.info(简介)和holder.size(holder.size)后速度确实快了,还有个疑问:为什么getView()方法会重复这么多次?
以下是注释掉获取图片的代码后的LOG:
08-30 03:58:49.631: INFO/ActivityManager(67): Starting activity: Intent { cmp=cn.com.cits.act/.video.MediaListActivity (has extras) }
08-30 03:58:51.812: INFO/global(340): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
08-30 03:58:59.681: WARN/ActivityManager(67): Launch timeout has expired, giving up wake lock!
08-30 03:58:59.783: DEBUG/dalvikvm(340): GC_FOR_MALLOC freed 4188 objects / 487192 bytes in 126ms
08-30 03:58:59.972: WARN/ActivityManager(67): Activity idle timeout for HistoryRecord{43f3d920 cn.com.cits.act/.video.MediaListActivity}
08-30 03:59:14.761: INFO/ActivityManager(67): Displayed activity cn.com.cits.act/.video.MediaListActivity: 24830 ms (total 24830 ms)

system.out.println 输出部分
08-30 03:58:51.882: INFO/System.out(340): VideoBean [id=1, videoName=canon介绍, videoSize=7分56秒, videoInfo=canon介绍, videoType=mp4, picType=jpg, blankBean=false]
08-30 03:58:51.892: INFO/System.out(340): ----- path = http://172.16.192.8:8080/NewCitsCRMS_service/upload/-----
08-30 03:58:52.552: INFO/System.out(340): getView Start!!!
08-30 03:58:52.902: INFO/System.out(340): getView Start!!!
08-30 03:58:53.022: INFO/System.out(340): getView Start!!!
08-30 03:58:53.152: INFO/System.out(340): getView Start!!!
08-30 03:58:53.321: INFO/System.out(340): getView Start!!!
08-30 03:58:53.442: INFO/System.out(340): getView Start!!!
08-30 03:58:53.582: INFO/System.out(340): getView Start!!!
08-30 03:58:53.712: INFO/System.out(340): getView Start!!!
08-30 03:58:53.862: INFO/System.out(340): getView Start!!!
08-30 03:58:53.982: INFO/System.out(340): getView Start!!!
08-30 03:58:54.112: INFO/System.out(340): getView Start!!!
08-30 03:58:54.321: INFO/System.out(340): getView Start!!!
08-30 03:58:54.601: INFO/System.out(340): getView Start!!!
08-30 03:58:54.861: INFO/System.out(340): getView Start!!!
08-30 03:58:55.403: INFO/System.out(340): getView Start!!!
08-30 03:58:55.632: INFO/System.out(340): getView Start!!!
08-30 03:58:55.912: INFO/System.out(340): getView Start!!!
08-30 03:58:56.041: INFO/System.out(340): getView Start!!!
08-30 03:58:56.172: INFO/System.out(340): getView Start!!!
08-30 03:58:56.342: INFO/System.out(340): getView Start!!!
08-30 03:58:56.483: INFO/System.out(340): getView Start!!!
08-30 03:58:56.612: INFO/System.out(340): getView Start!!!
08-30 03:58:56.751: INFO/System.out(340): getView Start!!!
08-30 03:58:56.872: INFO/System.out(340): getView Start!!!
08-30 03:58:57.023: INFO/System.out(340): getView Start!!!
08-30 03:58:57.152: INFO/System.out(340): getView Start!!!
08-30 03:58:57.291: INFO/System.out(340): getView Start!!!
08-30 03:58:57.422: INFO/System.out(340): getView Start!!!
08-30 03:58:57.571: INFO/System.out(340): getView Start!!!
08-30 03:58:57.692: INFO/System.out(340): getView Start!!!
08-30 03:58:57.822: INFO/System.out(340): getView Start!!!
08-30 03:58:57.952: INFO/System.out(340): getView Start!!!
08-30 03:58:58.113: INFO/System.out(340): getView Start!!!
08-30 03:58:58.242: INFO/System.out(340): getView Start!!!
08-30 03:58:58.371: INFO/System.out(340): getView Start!!!
08-30 03:58:58.501: INFO/System.out(340): getView Start!!!
08-30 03:58:58.641: INFO/System.out(340): getView Start!!!
08-30 03:58:58.772: INFO/System.out(340): getView Start!!!
08-30 03:58:58.903: INFO/System.out(340): getView Start!!!
08-30 03:58:59.032: INFO/System.out(340): getView Start!!!
08-30 03:58:59.172: INFO/System.out(340): getView Start!!!
08-30 03:58:59.322: INFO/System.out(340): getView Start!!!
08-30 03:58:59.452: INFO/System.out(340): getView Start!!!
08-30 03:58:59.581: INFO/System.out(340): getView Start!!!
08-30 03:58:59.952: INFO/System.out(340): getView Start!!!
08-30 03:59:00.312: INFO/System.out(340): getView Start!!!
08-30 03:59:00.452: INFO/System.out(340): getView Start!!!
08-30 03:59:00.582: INFO/System.out(340): getView Start!!!
08-30 03:59:00.812: INFO/System.out(340): getView Start!!!
08-30 03:59:00.941: INFO/System.out(340): getView Start!!!
08-30 03:59:01.072: INFO/System.out(340): getView Start!!!
08-30 03:59:01.201: INFO/System.out(340): getView Start!!!
08-30 03:59:01.372: INFO/System.out(340): getView Start!!!
08-30 03:59:01.502: INFO/System.out(340): getView Start!!!
08-30 03:59:01.632: INFO/System.out(340): getView Start!!!
08-30 03:59:01.762: INFO/System.out(340): getView Start!!!
08-30 03:59:01.911: INFO/System.out(340): getView Start!!!
08-30 03:59:02.042: INFO/System.out(340): getView Start!!!
08-30 03:59:02.182: INFO/System.out(340): getView Start!!!
08-30 03:59:02.302: INFO/System.out(340): getView Start!!!
08-30 03:59:02.461: INFO/System.out(340): getView Start!!!
08-30 03:59:02.591: INFO/System.out(340): getView Start!!!
08-30 03:59:02.721: INFO/System.out(340): getView Start!!!
08-30 03:59:02.842: INFO/System.out(340): getView Start!!!
08-30 03:59:03.541: INFO/System.out(340): getView Start!!!
08-30 03:59:03.691: INFO/System.out(340): getView Start!!!
08-30 03:59:04.751: INFO/System.out(340): getView Start!!!
08-30 03:59:05.122: INFO/System.out(340): getView Start!!!
08-30 03:59:05.271: INFO/System.out(340): getView Start!!!
08-30 03:59:05.402: INFO/System.out(340): getView Start!!!
08-30 03:59:05.552: INFO/System.out(340): getView Start!!!
08-30 03:59:05.682: INFO/System.out(340): getView Start!!!
08-30 03:59:05.811: INFO/System.out(340): getView Start!!!
08-30 03:59:05.952: INFO/System.out(340): getView Start!!!
08-30 03:59:06.101: INFO/System.out(340): getView Start!!!
08-30 03:59:06.232: INFO/System.out(340): getView Start!!!
08-30 03:59:06.363: INFO/System.out(340): getView Start!!!
08-30 03:59:06.492: INFO/System.out(340): getView Start!!!
08-30 03:59:06.642: INFO/System.out(340): getView Start!!!
08-30 03:59:06.772: INFO/System.out(340): getView Start!!!
08-30 03:59:06.902: INFO/System.out(340): getView Start!!!
08-30 03:59:07.033: INFO/System.out(340): getView Start!!!
08-30 03:59:07.271: INFO/System.out(340): getView Start!!!
08-30 03:59:07.402: INFO/System.out(340): getView Start!!!
08-30 03:59:07.533: INFO/System.out(340): getView Start!!!
08-30 03:59:07.671: INFO/System.out(340): getView Start!!!
08-30 03:59:07.811: INFO/System.out(340): getView Start!!!
08-30 03:59:07.942: INFO/System.out(340): getView Start!!!
08-30 03:59:08.072: INFO/System.out(340): getView Start!!!
08-30 03:59:08.203: INFO/System.out(340): getView Start!!!
08-30 03:59:08.372: INFO/System.out(340): getView Start!!!
08-30 03:59:08.501: INFO/System.out(340): getView Start!!!
08-30 03:59:08.642: INFO/System.out(340): getView Start!!!
08-30 03:59:08.771: INFO/System.out(340): getView Start!!!
08-30 03:59:08.912: INFO/System.out(340): getView Start!!!
08-30 03:59:09.041: INFO/System.out(340): getView Start!!!
08-30 03:59:09.172: INFO/System.out(340): getView Start!!!
08-30 03:59:09.311: INFO/System.out(340): getView Start!!!
08-30 03:59:09.481: INFO/System.out(340): getView Start!!!
08-30 03:59:09.612: INFO/System.out(340): getView Start!!!
08-30 03:59:09.752: INFO/System.out(340): getView Start!!!
08-30 03:59:09.882: INFO/System.out(340): getView Start!!!
08-30 03:59:10.031: INFO/System.out(340): getView Start!!!
08-30 03:59:10.163: INFO/System.out(340): getView Start!!!
08-30 03:59:10.291: INFO/System.out(340): getView Start!!!
08-30 03:59:10.421: INFO/System.out(340): getView Start!!!
08-30 03:59:10.582: INFO/System.out(340): getView Start!!!
08-30 03:59:10.703: INFO/System.out(340): getView Start!!!
08-30 03:59:10.841: INFO/System.out(340): getView Start!!!
08-30 03:59:10.971: INFO/System.out(340): getView Start!!!
08-30 03:59:11.112: INFO/System.out(340): getView Start!!!
08-30 03:59:11.251: INFO/System.out(340): getView Start!!!
08-30 03:59:11.392: INFO/System.out(340): getView Start!!!
08-30 03:59:11.521: INFO/System.out(340): getView Start!!!
08-30 03:59:11.751: INFO/System.out(340): getView Start!!!
08-30 03:59:11.882: INFO/System.out(340): getView Start!!!
08-30 03:59:12.021: INFO/System.out(340): getView Start!!!
08-30 03:59:12.151: INFO/System.out(340): getView Start!!!
08-30 03:59:12.311: INFO/System.out(340): getView Start!!!
08-30 03:59:12.442: INFO/System.out(340): getView Start!!!
08-30 03:59:12.571: INFO/System.out(340): getView Start!!!
08-30 03:59:12.722: INFO/System.out(340): getView Start!!!
08-30 03:59:12.881: INFO/System.out(340): getView Start!!!
08-30 03:59:13.012: INFO/System.out(340): getView Start!!!
08-30 03:59:13.141: INFO/System.out(340): getView Start!!!
08-30 03:59:13.291: INFO/System.out(340): getView Start!!!
08-30 03:59:13.442: INFO/System.out(340): getView Start!!!
08-30 03:59:13.561: INFO/System.out(340): getView Start!!!
08-30 03:59:13.703: INFO/System.out(340): getView Start!!!
08-30 03:59:13.832: INFO/System.out(340): getView Start!!!
mylzc 2011-08-30
  • 打赏
  • 举报
回复
刚才说的是listview。。不过gridview同理
mylzc 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 west_link 的回复:]

getView被重复调用是正常的,adapter里有多少条记录它就会被调用多少次,对于数据较多的情况可以考虑根据滚动位置来按需加载。
[/Quote]

不是adapter有多少条记录就被调用多少次。
getView()是在listitem进入listview可见区域时被调用的。
一开始如果有10个listitem可见,则调用10次getView()。
当listview滚动时会有新的listitem进入可见区域,此时调用getview()的次数与滚入的listitem个数是一致的。
West_Link 2011-08-30
  • 打赏
  • 举报
回复
getView被重复调用是正常的,adapter里有多少条记录它就会被调用多少次,对于数据较多的情况可以考虑根据滚动位置来按需加载。
youx 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mylzc 的回复:]

else {
holder.videoPlay.setVisibility(View.INVISIBLE);
}

你把这段注释掉看看
[/Quote]
这段去掉后还是有同样的问题....getView重复调用
sunmable 2011-08-30
  • 打赏
  • 举报
回复
通常情况下我们用ListView的时候要把耗时的东西放到线程里面,然后用handler发送出来,更新UI。

不建议使用AsynTask(同步任务)类
mylzc 2011-08-29
  • 打赏
  • 举报
回复
getview()中的这段代码会阻塞界面线程,导致界面卡死
url = new URL(filePath + videoBean.getId()
+ "."
+ videoBean.getPicType());
URLConnection conn = url.openConnection();
conn.connect();
Bitmap bm = BitmapFactory.decodeStream(conn.getInputStream());

你尝试下开启另外一条线程连接网络获取数据,然后使用handler来更新ui。
http://rayleung.iteye.com/blog/411860
也可以使用AsynTask类
http://www.iteye.com/topic/507442

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧