如何在android中"顺利"加载Listview

Den*_*nie 11 android listview

我将数据从Cursor加载到listview,但我的Listview并没有真正显示"平滑".当我在ListView中的scollbar上上下拖动时,数据会发生变化.有些项目看起来像我的列表中的重复显示.我有一个"复杂的ListView"(两个textview,一个imageview)所以我用newView(),bindView()来显示数据.有人能帮我吗?

Lyu*_*tko 11

我将向您介绍如何解决您的问题.这可能会对你有所帮助.

所以,在列表适配器中你有这样的代码:

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;
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,我们只有在检索到持有者后才设置列表项值.

但是如果你将代码移到上面的if语句中:

holder.label.setText(getLabel());
Run Code Online (Sandbox Code Playgroud)

所以它会像下面这样照顾:

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);
}
Run Code Online (Sandbox Code Playgroud)

您将获得列表项重复的当前应用程序行为.

可能会有所帮助.


emm*_*mby 8

ListView是一个棘手的野兽.

您的第二个问题是:您看到了重复项,因为ListView通过convertView重新使用了Views,但您并未确保重置已转换视图的所有方面.确保代码路径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;
}
Run Code Online (Sandbox Code Playgroud)

如果您没有使用自己的自定义视图,只需将呼叫替换new MyCustomView()为呼叫即可inflater.inflate(R.layout.my_layout,null)

关于你的第一个问题,你需要在这里观看Romain的关于ListView性能的技术:http://code.google.com/events/io/sessions/TurboChargeUiAndroidFast.html

从他的谈话和我自己的经验的重要性,

  • 使用convertView
  • 如果您有图像,请不要动态缩放图像.使用Bitmap.createScaledBitmap创建缩放位图并将其放入视图中
  • 使用ViewHolder,这样您就不必每次都调用一堆findViewByIds()
  • 降低列表视图中视图的复杂性.子视图越少越好.相对于LinearLayout,RelativeLayout比这更好.如果您正在实现自定义视图,请确保使用.