场景:ListView中有4个Item,那么,我问,第一次显示ListView时,getVie方法调用多少次?第二次显示ListVie时,又调用多少次?
有的人说不就4次吗,有的人说这个我不知道,有的人说,这个要看情况的。
确实!要看情况的!
先贴代码:
package com.example.listviewdemo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends Activity {
ListView listView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.mylistview);
listView.setAdapter(new MyAdapter());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
class MyAdapter extends BaseAdapter{
String[] s = {"A","B","C","D"};
@Override
public int getCount() {
return 4;
}
@Override
public Object getItem(int position) {
return s[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,
null); // viewgroup, false
holder.tv = (TextView)findViewById(R.id.tv);
convertView.setTag(holder);
Log.i("test","A:"+position+","+holder.hashCode());
} else {
holder = (ViewHolder) convertView.getTag();
}
Log.i("test","B:"+position+","+holder.hashCode());
return convertView;
}
class ViewHolder {
TextView tv;
}
}
}
布局文件: main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ListView android:id="@+id/mylistview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
item.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ListView android:id="@+id/mylistview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</RelativeLayout>
注意: 包在ListView外面的是RelativeLayout,这个到后面你就知道,也是会影响getView的调用次数的!!!!!!
接下来做不同的修改,看不同的日志输出,很诡异,很让人吃惊得想去喝可乐!
测试一:
1。 如果ListView的layout_width="fill_parent" 并且 layout_height="fill_parent"
日志输出:
08-16 12:16:54.450: I/test(9888): A:0,1090886984 08-16 12:16:54.450: I/test(9888): B:0,1090886984 08-16 12:16:54.450: I/test(9888): A:1,1090890856 08-16 12:16:54.450: I/test(9888): B:1,1090890856 08-16 12:16:54.450: I/test(9888): A:2,1090893840 08-16 12:16:54.450: I/test(9888): B:2,1090893840 08-16 12:16:54.460: I/test(9888): A:3,1090896720 08-16 12:16:54.460: I/test(9888): B:3,1090896720 2. 将ListView的layout_height="fill_parent"
结果:<ListView android:id="@+id/mylistview" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
08-16 12:17:54.410: I/test(9980): A:0,1090888024
08-16 12:17:54.410: I/test(9980): B:0,1090888024
08-16 12:17:54.410: I/test(9980): B:1,1090888024
08-16 12:17:54.410: I/test(9980): B:2,1090888024
08-16 12:17:54.410: I/test(9980): B:3,1090888024
08-16 12:17:54.490: I/test(9980): B:0,1090888024
08-16 12:17:54.490: I/test(9980): A:1,1090894640
08-16 12:17:54.490: I/test(9980): B:1,1090894640
08-16 12:17:54.500: I/test(9980): A:2,1090897624
08-16 12:17:54.500: I/test(9980): B:2,1090897624
08-16 12:17:54.500: I/test(9980): A:3,1090900504
08-16 12:17:54.500: I/test(9980): B:3,1090900504
08-16 12:17:54.530: I/test(9980): A:0,1090913200
08-16 12:17:54.530: I/test(9980): B:0,1090913200
08-16 12:17:54.530: I/test(9980): B:1,1090913200
08-16 12:17:54.530: I/test(9980): B:2,1090913200
08-16 12:17:54.540: I/test(9980): B:3,1090913200
3。 将
未完待续,先把活干完,再总结。