如何在ListView中强制元素的位置

时间:2012-04-08 14:28:15

标签: android listview position adapter items

我有一个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)); 只要我有一组有限的元素,它就很棒,因为我不需要滚动。但是,当我添加足够的元素时,在滚动之后,项目会交换它们的位置,如下所示:

Normal view All hell breaks loose

我怀疑这种行为是由于我打电话给mCategories.get(position)。因为视图永远不会保留在后台并且Android每次都会重新生成它们,所以我永远不会得到相同的项目,因为position很少会有相同的值。

有没有办法获得一个常数id,这可以让我获得固定位置的物品?我尝试使用getItemID,但我不明白如何实现它。

注意:每个字符串都来自strings.xml文件。在启动时,它们永远不会被比较,并且会被实例化一次。

1 个答案:

答案 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;