getView的代码如下:
public View getView(int position, View convertView, ViewGroup parent) {
Log.i(TAG, "getView -- " + position + " -- " + convertView);

ViewHolder holder = null;
if(convertView == null){
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.ivPic = (ImageView) convertView.findViewById(R.id.iv_pic);
holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);
holder.cbSelect = (CheckBox) convertView.findViewById(R.id.cb_selected);
holder.btOk = (Button) convertView.findViewById(R.id.btn_ok);

convertView.setTag(holder);
} else{
holder = (ViewHolder) convertView.getTag();
}

convertView.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
// viewHolder.cbSelect.toggle();
Log.i(TAG, "click the convertView at ");
}
});

holder.btOk.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
Log.i(TAG, "click the button");
}
});

holder.ivPic.setBackgroundResource(list.get(position).getPicId());
holder.tvTitle.setText(list.get(position).getTitle());

return convertView;
}我用的是模拟器,一屏显示了10个Item。
但是在logcat中查看日志,0--9 的视图getView方法被调用了三遍,listView加载完成后我不进行任何滑动
日志内容如下:
AndroidRuntime(577): NOTE: attach of thread 'Binder Thread #3' failed
getView -- 0 -- null
getView -- 1 -- android.widget.LinearLayout@40524048
getView -- 2 -- android.widget.LinearLayout@40524048
getView -- 3 -- android.widget.LinearLayout@40524048
getView -- 4 -- android.widget.LinearLayout@40524048
getView -- 5 -- android.widget.LinearLayout@40524048
getView -- 6 -- android.widget.LinearLayout@40524048
getView -- 7 -- android.widget.LinearLayout@40524048
getView -- 8 -- android.widget.LinearLayout@40524048
getView -- 9 -- android.widget.LinearLayout@40524048
getView -- 0 -- android.widget.LinearLayout@40524048
getView -- 1 -- null
getView -- 2 -- null
getView -- 3 -- null
getView -- 4 -- null
getView -- 5 -- null
getView -- 6 -- null
getView -- 7 -- null
getView -- 8 -- null
getView -- 9 -- null
getView -- 0 -- null
getView -- 1 -- android.widget.LinearLayout@4054b938
getView -- 2 -- android.widget.LinearLayout@4054b938
getView -- 3 -- android.widget.LinearLayout@4054b938
getView -- 4 -- android.widget.LinearLayout@4054b938
getView -- 5 -- android.widget.LinearLayout@4054b938
getView -- 6 -- android.widget.LinearLayout@4054b938
getView -- 7 -- android.widget.LinearLayout@4054b938
getView -- 8 -- android.widget.LinearLayout@4054b938
getView -- 9 -- android.widget.LinearLayout@4054b938
Displayed com.lxy/.AppMainActivity: +1s282ms应该只加载1--9一次,并且convertView是null才对吧,我没有滑动过。这是为什么呢?

解决方案 »

  1.   

    不是只加载0~9一次,是加载0~9两次。因为第一次切换到这里,convertView没有缓存的话,先0~9创建了之后,再0~9做一次显示。比如
    getView -- 0 -- null
    getView -- 1 -- null
    getView -- 2 -- null
    getView -- 3 -- null
    getView -- 4 -- null
    getView -- 5 -- null
    getView -- 6 -- null
    getView -- 7 -- null
    getView -- 8 -- null
    getView -- 9 -- null
    getView -- 0 -- android.widget.LinearLayout@4054b938
    getView -- 1 -- android.widget.LinearLayout@4054b938
    getView -- 2 -- android.widget.LinearLayout@4054b938
    getView -- 3 -- android.widget.LinearLayout@4054b938
    getView -- 4 -- android.widget.LinearLayout@4054b938
    getView -- 5 -- android.widget.LinearLayout@4054b938
    getView -- 6 -- android.widget.LinearLayout@4054b938
    getView -- 7 -- android.widget.LinearLayout@4054b938
    getView -- 8 -- android.widget.LinearLayout@4054b938
    getView -- 9 -- android.widget.LinearLayout@4054b938这是第一次不滑动应该这么显示,如果你的LISTVIEW可以显示下10条记录的话应该是这样的。
      

  2.   

    数据我创建了80条呢,所以足够显示两屏以上。但为什么第二次调用getview的时候convertView就不为空了呢。我把我的全部代码贴一下,希望大家赐教
    MyBaseAdapter.java
    public class MyAdapter extends BaseAdapter{ private final static String TAG = "MyAdapter";
    private Context mContext;
    private ArrayList<String> list;
    private LayoutInflater mInflater;

    public MyAdapter(Context context, ArrayList<String> list){
    mContext = context;
    this.list = list;
    mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
    return list.size();
    } @Override
    public Object getItem(int position) {
    return list.get(position);
    } @Override
    public long getItemId(int position) {
    return position;
    } @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    Log.i(TAG, "getView -- " + position + " -- " + convertView);

    ViewHolder holder = null;
    if(convertView == null){
    convertView = mInflater.inflate(R.layout.list_item, null);
    holder = new ViewHolder();
    holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);

    convertView.setTag(holder);
    } else{
    holder = (ViewHolder) convertView.getTag();
    }

    holder.tvTitle.setText(list.get(position));

    return convertView;
    }

    public class ViewHolder{
    public TextView tvTitle;
    }}AppMainActivity.java
    public class AppMainActivity extends Activity {

    private final static String TAG = "AppMainActivity";
    private ListView mList;
    MyAdapter adapter = null;

        /** Called when the activity is first created. */
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            mList = (ListView) findViewById(R.id.lv_display);
            ArrayList<String> data = new ArrayList<String>();
    for(int i = 0; i < 80; i++){
    data.add("Item " + i);
    }

    adapter = new MyAdapter(this, data);
    mList.setAdapter(adapter);
        }
    }
    我哪里写的不对
      

  3.   

    还有,滑动的时候getview调用正常。就是上下滑动是屏幕上每次出来一个新的item,getview方法就被调用一次。
      

  4.   

    呵呵,找到原因了。是listView的属性设置
    android:layout_height="wrap_content"改成
    android:layout_height="fill_parent"
    也是在论坛的一个角落里发现的。ListView的layout_height属性不设置成fill_parent总会出一些问题
    所以在使用ListView的时候一定记得这个属性。
      

  5.   

    我的GridView设置成fill_parent不行啊,怎么办?求指教