我将数据从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)
您将获得列表项重复的当前应用程序行为.
可能会有所帮助.
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
从他的谈话和我自己的经验的重要性,