我不明白为什么getView()方法无法正确运行时,我重用视图组件
我定义了一个适配器,它延伸BaseAdapter
当我用ListView
来显示东西。我重写View getView (int position, View convertView, ViewGroup parent)
方法重用视图组件,在方法中,我也写了if(convertView == null) {System.out.println("test");}
块。 ListView
有50行数据,屏幕只能显示20行左右的数据。当我运行该应用程序时,尽管我滑动屏幕以确保所有数据都已加载,但LogCat打印的行少于50行“测试”。但为什么?我认为它应该打印50行数据。下面是关键代码:我不明白为什么getView()方法无法正确运行时,我重用视图组件
@Override public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = inflater.inflate(resource, null);
System.out.println(++count + "convertView == null:" + convertView);
}
}
有人请帮助我,我是一个新手....感谢
回答:
因为convertView
将null
仅如果没有可以回收先前所返回视图(即它不再在屏幕上)。
您从适配器的getView()
返回的视图可以在稍后调用getView()
时回收。该框架通过convertView
参数传递了可回收的视图。
所以你的convertView == null
分支只能运行足够多的次数来填充列表视图屏幕一次,之后,当滚动时,这些旧的视图被回收。
回答:
Android不夸大为您的适配器每一个项目视图。它重复使用先前用于其他项目的充实视图。
在一个适配器绑定视图的模式是这样的:
@Override public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null) {
view = inflater.inflate(resource, null);
} else {
view = convertView;
}
// bind data to view here
return view;
}
事实上,你通常会使用一个ViewHolder类。但在阅读有关信息之前,请先修复基本适配器。
回答:
您缺少return view
。
ListView回收视图。 How ListView's recycling mechanism works
使用ViewHolder
模式
http://developer.android.com/training/improving-layouts/smooth-scrolling.html
@Override public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
convertView = inflater.inflate(resource, null);
holder = new ViewHolder();
holder.tv = (TextView)convertView.findViewById(R.id.textView1);
//initialize views
convertView.setTag(holder);
} else {
holder =(ViewHolder) convertView.getTag();
}
// update your view here
holder.tv.setText("hi");
return convertView;
}
static class ViewHolder {
// YourViews Declaration
TextView tv; // an example
}
以上是 我不明白为什么getView()方法无法正确运行时,我重用视图组件 的全部内容, 来源链接: utcz.com/qa/260740.html