要实现功能如下图:问题:用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>

解决方案 »

  1.   

    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
      

  2.   

    注释掉这段获取图片的代码,只保留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!!!
      

  3.   

    else {
                holder.videoPlay.setVisibility(View.INVISIBLE);
            }你把这段注释掉看看
      

  4.   

    通常情况下我们用ListView的时候要把耗时的东西放到线程里面,然后用handler发送出来,更新UI。不建议使用AsynTask(同步任务)类
      

  5.   

    这段去掉后还是有同样的问题....getView重复调用
      

  6.   

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

  7.   


    不是adapter有多少条记录就被调用多少次。
    getView()是在listitem进入listview可见区域时被调用的。
    一开始如果有10个listitem可见,则调用10次getView()。
    当listview滚动时会有新的listitem进入可见区域,此时调用getview()的次数与滚入的listitem个数是一致的。
      

  8.   

    刚才说的是listview。。不过gridview同理
      

  9.   

         同理吗?gridview发放调用多次是正常的。一句话这里调用gridview的次数是不确定。