我不明白为什么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);

}

}

有人请帮助我,我是一个新手....感谢

回答:

因为convertViewnull仅如果没有可以回收先前所返回视图(即它不再在屏幕上)。

您从适配器的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

回到顶部