要实现功能如下图:问题:用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>
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>
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
以下是注释掉获取图片的代码后的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!!!
holder.videoPlay.setVisibility(View.INVISIBLE);
}你把这段注释掉看看
不是adapter有多少条记录就被调用多少次。
getView()是在listitem进入listview可见区域时被调用的。
一开始如果有10个listitem可见,则调用10次getView()。
当listview滚动时会有新的listitem进入可见区域,此时调用getview()的次数与滚入的listitem个数是一致的。