0

我有一个活动,它只是列出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 文件。在启动时,它们永远不会被比较,并且被实例化一次。

4

1 回答 1

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;
于 2012-04-08T14:46:46.203 回答