java-为什么滚动浏览列表时会重新排序?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-为什么滚动浏览列表时会重新排序?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2763字,纯文字阅读大概需要4分钟。
内容图文
![java-为什么滚动浏览列表时会重新排序?](/upload/InfoBanner/zyjiaocheng/674/ca6565d9e8e445769ff964fc73a57d3d.jpg)
滚动浏览列表时,列表会重新排序..这非常令人困惑.
这是我正在使用的自定义适配器:
public class LoadExpenseList extends BaseAdapter{
List<Expense> expenses;
Context context;
public LoadExpenseList(Context context, int textViewResourceId,
List<Expense> expenses) {
super();
this.expenses = expenses;
this.context = context;
}
public View getView(final int position, View convertView, ViewGroup parent){
//View v = convertView;
AvailableExpenseView btv;
if (convertView == null) {
btv = new AvailableExpenseView(context, expenses.get(position));
} else {
btv = (AvailableExpenseView) convertView;
}
btv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i("Expense_Availables", "Item Selected!!");
Intent intent = new Intent(getActivity(), ItemDetailActivity.class);
int id = expenses.get(position).getExpenseItemId();
intent.putExtra("id", id);
startActivity(intent);
}
});
btv.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View arg0) {
// TODO Auto-generated method stub
return false;
}
});
registerForContextMenu(btv);
return btv;
}
@Override
public int getCount() {
return expenses.size();
}
@Override
public Object getItem(int position) {
return expenses.get(position);
}
@Override
public long getItemId(int position) {
return expenses.get(position).getExpenseItemId();
}
}
解决方法:
因为您的视图(AvailableExpenseView)是用一个项目构造的,所以当适配器尝试通过convertView重用视图时,您将获得一个已经绑定到另一个项目的视图.
不要用模型项构造视图,而是调用诸如convertView.setExpense(expenses.get(position))之类的东西.
ListView将尝试重用视图以提高性能.因此,将发生的事是,列表中的第一项与新创建的视图一起显示,随后在您滚动时,它将尝试重用以前创建的视图,并通过convertView提供视图.请注意以下几行:
if (convertView == null) {
// You create a view using the proper item
btv = new AvailableExpenseView(context, expenses.get(position));
} else {
// You don't override the item that was previously assigned
// when the view was created
btv = (AvailableExpenseView) convertView;
}
如果convertView为null,则说明您正在创建一个新视图,但是要使用一个项目来构造视图.因此,我们假设此位置为0.您将使用列表中第一个的费用创建一个视图.稍后,listView想要获取位置20的视图,并说“确定,让我们重新使用我们用于位置0的视图”,因此它将该视图作为convertView传递,但是此视图已经在位置0处创建了该视图.并且您不会覆盖它.因此,您最终使用的视图具有第一个项目代表第20个项目.
要解决此问题,您可以轻松地执行以下操作:
AvailableExpenseView btv;
if (convertView == null) {
// dont create your view with an item
btv = new AvailableExpenseView(context);
} else {
btv = (AvailableExpenseView) convertView;
}
// Assign the expense wether it is a newly created view or
// a view that is reused
btv.setExpense(expenses.get(position));
当然,您将必须编辑AvailableExpenseView并创建一个setExpense()方法来填充视图.
内容总结
以上是互联网集市为您收集整理的java-为什么滚动浏览列表时会重新排序?全部内容,希望文章能够帮你解决java-为什么滚动浏览列表时会重新排序?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。