滚动时自定义ListView中的错误

时间:2012-05-31 18:39:15

标签: android android-layout android-listview

在myadapter.java中,我有以下代码:

public View getView(int position,View convertView,ViewGroup parent) {
  View view=null;
  if(convertView!=null)view=convertView;else view=newView(context,parent);
  HashMap<String,String> d=new HashMap<String,String>();
  d=data.get(position);
  String _r=d.get("r");
  String out=d.get("out");
  Typeface mf=Typeface.createFromAsset(context.getAssets(),"fonts/mf.ttf");
  TextView txt=(TextView)view.findViewById(R.id.c_n);
  txt.setText(_r);
  txt.setTypeface(mf);
  if(out.equals("yes") && !d.get("sid").equals("-1")) {
    ImageView imag=(ImageView)view.findViewById(R.id.myimage);
    imag.setVisibility(imag.VISIBLE);//This fires sometimes while scroll, while
    //I scroll & where I don't need it.
    //view.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.c_c));
    //^ same as setVisibility.
  }
  ...
  return view;
}

当我启动我的应用时,此列表没问题。但是,当我滚动时,imag.setVisibility(imag.VISIBLE);有时会在我不需要的地方触发,就像listview生成每个滚动事件一样。一些ImageViews变得可见,而不是应用程序启动。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题是由convertView及其用于重新循环现有视图的方式引起的。

示例 - 假设您的列表适配器有20个项目,但ListView只能在屏幕上显示5个。这些5个列表项“视图”将通过在滚动convertView时作为ListView参数传递来重新循环。

设置ImageView的可见性后,它将保留在convertView中。换句话说,如果您不希望它可见,则需要将其设置为INVISIBLEGONE ...

ImageView imag=(ImageView)view.findViewById(R.id.myimage);
if (d.get("ms").equals("yes") && !d.get("sid").equals("-1")) {
    imag.setVisibility(View.VISIBLE);
}
else
    imag.setVisibility(View.INVISIBLE); // Or use View.GONE depending on what you need