我有一个Activity,它只包含列出Pair<String, String>
个对象。我有一个自定义TextWithSubTextAdapter
,它扩展了ArrayAdapter:
public View getView(int position,View convertView,ViewGroup parent) {
View view; if (convertView == null) { LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = li.inflate(R.layout.text_sub, null); TextView tv = (TextView)view.findViewById(R.id.mainText); tv.setText(mCategories.get(position).first); TextView desc = (TextView)view.findViewById(R.id.subText); desc.setText(Html.fromHtml(mCategories.get(position).second)); } else { view = (View) convertView; } return view;
}
mCategories是ArrayList<Pair<String, String>>
然后我致电lv.setAdapter(new TextSubTextAdapter(this, Common.physConstants));
只要我有一组有限的元素,它就很棒,因为我不需要滚动。但是,当我添加足够的元素时,在滚动之后,项目会交换它们的位置,如下所示:
我怀疑这种行为是由于我打电话给mCategories.get(position)
。因为视图永远不会保留在后台并且Android每次都会重新生成它们,所以我永远不会得到相同的项目,因为position
很少会有相同的值。
有没有办法获得一个常数id,这可以让我获得固定位置的物品?我尝试使用getItemID,但我不明白如何实现它。
注意:每个字符串都来自strings.xml文件。在启动时,它们永远不会被比较,并且会被实例化一次。
答案 0 :(得分:1)
当您滚动列表时,Android会动态重新使用滚出屏幕的视图。这些convertViews还没有应该在这个位置的内容。你必须手动设置。
View view;
if (convertView == null)
{
LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = li.inflate(R.layout.text_sub, null);
}
else
{
view = convertView;
}
TextView tv = (TextView)view.findViewById(R.id.mainText);
tv.setText(mCategories.get(position).first);
TextView desc = (TextView)view.findViewById(R.id.subText);
desc.setText(Html.fromHtml(mCategories.get(position).second));
return view;