根据需要调用getView()
我有一个ListView
,它在每一行显示从互联网上拉出来的图像和一个字符串。
一般来说,它工作正常。 但是,我想在视图(行)膨胀时的方式上进行控制。 默认情况下,当行可见时,调用适配器的getView()
方法。
这当然不是最好的行为之一,因为如果我有一个带有几百条记录的ListView
,并且我需要在底部滚动ListView
同时滚动ListView
,则将为每行调用getView()
方法,直到我到达页脚。
所以我只想在滚动和ListView处于暂停/空闲状态后才调用getView,但我不知道如何去做这件事:
以下是我开始的方式:
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState==SCROLL_STATE_IDLE){
// Invoke get view only on visible items
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
这是我的适配器的getView:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.row, parent, false);
holder = new ViewHolder();
holder.title = (TextView) convertView.findViewById(R.id.textView);
holder.image = (ImageView) convertView.findViewById(R.id.imageView);
holder.position = position;
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText(data.get(position).getTitle());
holder.image.setImageResource(R.drawable.ic_launcher);
new LoadImageAsync(data.get(position).getUrl(), holder.image).execute();
return convertView;
}
请给我一些指导,说明为了实现这个目标我应该看看:只有在滚动后才能调用getView(),并且只能在可见项目中调用getView()。
我最近在这里阅读了一篇文章。 我没有尝试过,但它似乎是一个合理的理论。
基本上,他们主张添加一个布尔值,用于跟踪您是否滚动,并将其用作适配器中的标志。 如果布尔值为true(正在滚动),则只能在布局中绘制文字视图。 如果为false(您已停止滚动),则绘制所有内容。
通过使用notifyDataSetChanged()
您可以指示适配器在不滚动时重新绘制可见视图。