试着写了写简单的代码,想看看getView是什么时候执行和怎么执行的
代码如下:package com.test.activity;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;public class EasyTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridView = (GridView)findViewById(R.id.GridView1);
CustomAdapter adapter = new CustomAdapter(this, android.R.layout.simple_expandable_list_item_1, new String[] {"1","2","3"});
gridView.setAdapter(adapter);
}
public class CustomAdapter extends ArrayAdapter<String> { public CustomAdapter(Context context, int resource,
String[] objects) {
super(context, resource, objects);
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = super.getView(position, convertView, parent);
//在这里输出是为第几条创建View和View的地址
Log.v(new String(),
"View(" + String.valueOf(position) + ")" + " = " + convertView.toString());
}
return convertView;
}
}
}
执行的时候,输出的结果是:
08-08 05:23:29.678: I/dalvikvm(2450): Wrote stack traces to '/data/anr/traces.txt'
08-08 05:23:29.939: V/(2450): View(0) = android.widget.TextView@412c7f88
08-08 05:23:29.988: V/(2450): View(1) = android.widget.TextView@412c9b48
08-08 05:23:29.988: V/(2450): View(2) = android.widget.TextView@412ca478
08-08 05:23:30.018: V/(2450): View(0) = android.widget.TextView@412cb150
08-08 05:23:30.038: D/gralloc_goldfish(2450): Emulator without GPU emulation detected.
这里我就不明白了,为什么会为第0条数据创建了两次view?这是第一个问题....之后我修改了一下代码,记录下了给第0条创建的两个view,然后分别修改两个view的BackgroundColor,发现只有修改第一次创建的view的时候器作用,修改第二次创建的view时没有效果。那第二次创建的view去哪了?
代码如下:package com.test.activity;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;public class EasyTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridView = (GridView)findViewById(R.id.GridView1);
CustomAdapter adapter = new CustomAdapter(this, android.R.layout.simple_expandable_list_item_1, new String[] {"1","2","3"});
gridView.setAdapter(adapter);
}
public class CustomAdapter extends ArrayAdapter<String> { public CustomAdapter(Context context, int resource,
String[] objects) {
super(context, resource, objects);
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = super.getView(position, convertView, parent);
//在这里输出是为第几条创建View和View的地址
Log.v(new String(),
"View(" + String.valueOf(position) + ")" + " = " + convertView.toString());
}
return convertView;
}
}
}
执行的时候,输出的结果是:
08-08 05:23:29.678: I/dalvikvm(2450): Wrote stack traces to '/data/anr/traces.txt'
08-08 05:23:29.939: V/(2450): View(0) = android.widget.TextView@412c7f88
08-08 05:23:29.988: V/(2450): View(1) = android.widget.TextView@412c9b48
08-08 05:23:29.988: V/(2450): View(2) = android.widget.TextView@412ca478
08-08 05:23:30.018: V/(2450): View(0) = android.widget.TextView@412cb150
08-08 05:23:30.038: D/gralloc_goldfish(2450): Emulator without GPU emulation detected.
这里我就不明白了,为什么会为第0条数据创建了两次view?这是第一个问题....之后我修改了一下代码,记录下了给第0条创建的两个view,然后分别修改两个view的BackgroundColor,发现只有修改第一次创建的view的时候器作用,修改第二次创建的view时没有效果。那第二次创建的view去哪了?
我在意的是他给同一条记录生成了两个一样的view,第二次生成的view虽然不影响显示但一直存在着,这样不会占用多余的内存吗
//这个里面就inflate convertview
}
后面就,通过convertview.findviewbyid来搞,设置内容
return convertView;不会浪费
我这里面不是已经判断了吗?就是因为判断出convertView是null,所以才会输出第二次生成的结果。我原来以为是把第一次的生成的view销毁了才执行第二次生成的,但是同时记录下两次的view以后才发现问题:
一是为什么第二次跑到第0条的时候,会判断出convertView是null?
二是为什么既然判断是null了,并生成了新的view,为什么旧的view没有销毁?
三室为什么对旧的view操作可以产生效果,对新的view操作却不产生效果?
不知道你是不是这个原因。
http://blog.csdn.net/f8376904110/article/details/6460934