Dan*_*n B 43 android listview android-arrayadapter
我在自定义ArrayAdapter中有一个ListView,它在每行中显示一个图标ImageView和一个TextView.当我使列表足够长以允许您滚动它时,顺序开始正确,但是当我开始向下滚动时,一些较早的条目开始重新出现.如果我向上滚动,旧订单会更改.反复执行此操作最终会导致整个列表顺序看似随机.因此,滚动列表要么导致子顺序更改,要么绘图未正确刷新.
什么可能导致这样的事情发生?我需要将项目显示给用户的顺序与它们添加到ArrayList的顺序相同,或者至少保持一个静态顺序.如果我需要提供更详细的信息,请告诉我.任何帮助表示赞赏.谢谢.
far*_*ats 57
我遇到了类似的问题,但是当点击自定义列表中的项目时,屏幕上的项目将按顺序反转.如果我再次点击它们,它们会反转回原来的位置.
读完之后,我检查了我的代码,我在那里重载了getView方法.我从convertView获取视图,如果它是null,那就是我构建我的东西的时候.但是,在放置断点之后,我发现它在每次单击时调用此方法,并且在后续单击时,convertedView不为null,因此未设置项目.
这是一个例子:
public View getView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
if (view == null)
{
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(R.layout.listitemrow, null);
RssItem rssItem = (RssItem) super.getItem(position);
if (rssItem != null)
{
TextView title = (TextView) view.findViewById(R.id.rowtitle);
if (title != null)
{
title.setText(rssItem.getTitle());
}
}
}
return view;
}
Run Code Online (Sandbox Code Playgroud)
微妙的变化是将视图上的空检查的近括号移动到膨胀之后:
public View getView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
if (view == null)
{
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(R.layout.listitemrow, null);
}
RssItem rssItem = (RssItem) super.getItem(position);
if (rssItem != null)
{
TextView title = (TextView) view.findViewById(R.id.rowtitle);
if (title != null)
{
title.setText(rssItem.getTitle());
}
}
return view;
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助那些遇到同样问题的人.
为了以更一般的方式进一步澄清下面farcats的答案,这是我的解释:
vi.inflate操作(此处需要从 XML 解析行的布局并创建适当的 View 对象)由if (view == null)语句包装以提高效率,因此不会发生同一对象的膨胀每次它突然出现在视野中时都会一次又一次地出现。
但是,getView 方法的其他部分用于设置其他参数,因此不应包含在if (view == null)语句中。
类似地,在该方法的其他常见实现中,一些 textView、ImageView 或 ImageButton 元素需要使用findViewById以及之后的.setText或.setImageBitmap操作由 list[position] 中的值填充。这些操作必须在通过膨胀从头开始创建视图并获取现有视图(如果不为空)之后进行。
将此解决方案应用于 BaseAdapter 的另一个好例子出现在BaseAdapter 中,导致 ListView 在滚动时乱序
当您滚动时,ListView 会重用视图对象。您是否重写了 getView 方法?您需要确保为每个视图设置每个属性,不要假设它会记住您之前的内容。如果您发布该方法,有人可能会指出不正确的部分。
| 归档时间: |
|
| 查看次数: |
16289 次 |
| 最近记录: |