“如何加载Listview”;“顺利”;在android中
我将数据从游标加载到listview,但我的listview并没有真正显示“平滑”。当我在ListView中的scollbar上下拖动时,数据会发生变化。有些项目在我的列表中看起来像重复显示。“如何加载Listview”;“顺利”;在android中,android,listview,Android,Listview,我将数据从游标加载到listview,但我的listview并没有真正显示“平滑”。当我在ListView中的scollbar上下拖动时,数据会发生变化。有些项目在我的列表中看起来像重复显示。 我有一个“复杂的ListView”(两个textview,一个imageview),所以我使用newView(),bindView()来显示数据。有人能帮我吗?我将向您介绍如何解决您遇到的此类问题。这可能对你有帮助 因此,在列表适配器中有这样的代码: public View getView(int pos
我有一个“复杂的ListView”(两个textview,一个imageview),所以我使用newView(),bindView()来显示数据。有人能帮我吗?我将向您介绍如何解决您遇到的此类问题。这可能对你有帮助 因此,在列表适配器中有这样的代码:
public View getView(int position, View contentView, ViewGroup arg2)
{
ViewHolder holder;
if (contentView == null) {
holder = new ViewHolder();
contentView = inflater.inflate(R.layout.my_magic_list,null);
holder.label = (TextView) contentView.findViewById(R.id.label);
contentView.setTag(holder);
} else {
holder = (ViewHolder) contentView.getTag();
}
holder.label.setText(getLabel());
return contentView;
}
正如您所看到的,我们仅在检索holder之后才设置列表项的值
但如果将代码移到上面的if语句中:
holder.label.setText(getLabel());
因此,它将如下所示:
if (contentView == null) {
holder = new ViewHolder();
contentView = inflater.inflate(R.layout.my_magic_list,null);
holder.label = (TextView) contentView.findViewById(R.id.label);
holder.label.setText(getLabel());
contentView.setTag(holder);
}
您将拥有列表项复制的当前应用程序行为
它可能会有所帮助。ListView是一个狡猾的野兽 首先是第二个问题:您看到的是重复的,因为ListView通过convertView重新使用视图,但您不能确保重置转换视图的所有方面。确保
convertView的代码路径正确=null
正确设置视图的所有数据,所有内容都应该正常工作
如果使用的是自定义视图,则希望getView()
方法大致如下所示:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final MyCustomView v = convertView!=null ? (MyCustomView)convertView : new MyCustomView();
v.setMyData( listAdapter.get(position) );
return v;
}
如果您没有使用自己的自定义视图,只需将调用new MyCustomView()
替换为调用inflater.inflate(R.layout.my\u layout,null)
关于你的第一个问题,你可以在这里观看Romain的关于ListView性能的techtalk:
从他的谈话和我自己的经历来看
- 使用convertView
- 如果您有图像,请不要动态缩放图像。使用Bitmap.createScaledBitmap创建缩放位图并将其放入视图中
- 使用ViewHolder,这样就不必每次都调用一堆FindViewById()
- 降低listview中视图的复杂性。子视图越少越好。相对论在这方面要比线性布局好得多。如果要实现自定义视图,请确保使用
- 我也面临这个问题,但在我的例子中,我使用线程来获取外部图像。如果重用imageView,则当前执行线程不要更改它,这一点很重要
public View getView(int position, View vi, ViewGroup parent) {
ViewHolder holder;
String imageUrl = ...;
if (vi == null) {
vi = inflater.inflate(R.layout.tweet, null);
holder = new ViewHolder();
holder.image = (ImageView) vi.findViewById(R.id.row_img);
...
vi.setTag(holder);
} else {
holder = (ViewHolder) vi.getTag();
}
holder.image.setTag(imageUrl);
...
DRAW_MANAGER.fetchDrawableOnThread(imageUrl, holder.image);
}
然后在获取线程上,我正在执行重要检查:
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
// VERY IMPORTANT CHECK
if (urlString.equals(url))
imageView.setImageDrawable((Drawable) message.obj);
};
Thread thread = new Thread() {
@Override
public void run() {
Drawable drawable = fetchDrawable(urlString);
if (drawable != null) {
Message message = handler.obtainMessage(1, drawable);
handler.sendMessage(message);
}
}};
thread.start();
如果重用当前线程的视图(如前所述),也可以取消当前线程,但我决定不这样做,因为我想填充缓存以供以后重用。如果处理方式错误,则可以看到多行重复出现的文本。我最近在博客上写了一点关于它的内容——见。除此之外,你可能想看看。一般来说,这是因为视图重用,我已经见过几次了。只有一个提示:永远不要使用项目布局的透明背景-这会大大降低性能对不起,但我使用newView()、bindView()来显示数据。这是同样的问题吗?我想我发现一些有用的视频,谢谢分享!