Android 定制阵列适配器&x2B;ListView中,某些行未正确处理

Android 定制阵列适配器&x2B;ListView中,某些行未正确处理,android,listview,android-arrayadapter,Android,Listview,Android Arrayadapter,这篇文章将大量刊登图片 我已经创建了一个自定义ArrayAdapter,并在Listview上使用它。适配器上有什么东西漏了吗 @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; ArrayHolder holder = null; if(row == null) {

这篇文章将大量刊登图片

我已经创建了一个自定义ArrayAdapter,并在Listview上使用它。适配器上有什么东西漏了吗

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
      View row = convertView;
      ArrayHolder holder = null;

      if(row == null)
      {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ArrayHolder();
        holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
        row.setTag(holder);
     }
     else
     {
        if(position % 2 == 0){row.setBackgroundColor(Color.DKGRAY);}
        else{row.setBackgroundColor(Color.BLACK);}

        Typeface font1 =Typeface.createFromAsset(context.getAssets(),"fonts/kingrich.ttf");
        ((TextView)row.findViewById(R.id.txtTitle)).setTypeface(font1);
        ((TextView)row.findViewById(R.id.txtTitle)).setTextColor(Color.rgb(153, 255, 102));

        holder = (ArrayHolder)row.getTag();

    }

    String array = data.get(position);
    holder.txtTitle.setText(array);
    return row;
  }
首次启动应用程序时,将显示以下屏幕: (屏幕构成实际设备,而不是模拟器)

现在,如果我用后退按钮关闭虚拟键盘,当我向下滚动一点时,在底部我已经可以看到一行的颜色不正确:

如果我上下滚动,该行将获得正确的颜色


提前感谢

不要将剩余代码放在if的else部分(row==null):

textView txtTitle没有着色,因为else块被跳过,因为listview没有可循环使用的视图
当您向上/向下滚动时,视图的循环开始了,您可以转到其他部分。最好完全删除sle部分,因为无论convertview是否为null,您都希望文本视图着色。

不要将剩余代码放在if的else部分(row==null):

textView txtTitle没有着色,因为else块被跳过,因为listview没有可循环使用的视图
当您向上/向下滚动时,视图的循环开始了,您可以转到其他部分。最好完全删除sle部分,因为无论convertview是否为null,您都希望文本视图被着色。

在我看来,您没有正确处理新视图的创建

文本显示为白色,这表明跳过了else块(因此convertView参数为null,或者没有要回收的视图(这是公平的,因为当软键盘消失时,您会看到更多视图)

该行在上/下滚动后正确上色,因为您现在有视图要回收,因此将进入else块

Imho您应该完全删除else关键字。 这样,您将仅在实际需要时输入if(创建新视图的位置),否则,即使视图是新的且未回收,您也将始终使用正确的颜色

试试看,告诉我它是否有效

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View row = convertView;
  ArrayHolder holder = null;

  if(row == null)
  {
    LayoutInflater inflater = ((Activity)context).getLayoutInflater();
    row = inflater.inflate(layoutResourceId, parent, false);
    holder = new ArrayHolder();
    holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
    row.setTag(holder);
 }
//this part must be executed every time, not only for recycled views
  if(position % 2 == 0){row.setBackgroundColor(Color.DKGRAY);}
  else{row.setBackgroundColor(Color.BLACK);}

  Typeface font1 = Typeface.createFromAsset(context.getAssets(),   "fonts/kingrich.ttf");
  ((TextView)row.findViewById(R.id.txtTitle)).setTypeface(font1);
  ((TextView)row.findViewById(R.id.txtTitle)).setTextColor(Color.rgb(153, 255, 102));

  holder = (ArrayHolder)row.getTag();



  String array = data.get(position);
  holder.txtTitle.setText(array);
  return row;
}

在我看来,您没有正确处理新视图的创建

文本显示为白色,这表明跳过了else块(因此convertView参数为null,或者没有要回收的视图(这是公平的,因为当软键盘消失时,您会看到更多视图)

该行在上/下滚动后正确上色,因为您现在有视图要回收,因此将进入else块

Imho您应该完全删除else关键字。 这样,您将仅在实际需要时输入if(创建新视图的位置),否则,即使视图是新的且未回收,您也将始终使用正确的颜色

试试看,告诉我它是否有效

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View row = convertView;
  ArrayHolder holder = null;

  if(row == null)
  {
    LayoutInflater inflater = ((Activity)context).getLayoutInflater();
    row = inflater.inflate(layoutResourceId, parent, false);
    holder = new ArrayHolder();
    holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
    row.setTag(holder);
 }
//this part must be executed every time, not only for recycled views
  if(position % 2 == 0){row.setBackgroundColor(Color.DKGRAY);}
  else{row.setBackgroundColor(Color.BLACK);}

  Typeface font1 = Typeface.createFromAsset(context.getAssets(),   "fonts/kingrich.ttf");
  ((TextView)row.findViewById(R.id.txtTitle)).setTypeface(font1);
  ((TextView)row.findViewById(R.id.txtTitle)).setTextColor(Color.rgb(153, 255, 102));

  holder = (ArrayHolder)row.getTag();



  String array = data.get(position);
  holder.txtTitle.setText(array);
  return row;
}

谢谢你的快速回答。它肯定解决了问题,我现在对Android开发相当满意。我只是想掌握概念。我也是新手。欢迎来到Android和SO:)谢谢你的快速回答。它肯定解决了问题,我现在对Android开发相当熟悉。我只是想掌握概念。我也是新手。欢迎来到Android,所以:)谢谢你的快速回答。这肯定解决了问题,我现在对安卓开发相当满意。我只是想抓住这个概念。没有问题,你真的有了一个好的开始,因为你已经面临定制适配器:)谢谢你的快速回答。这肯定解决了问题,我现在对安卓开发相当满意。我只是想抓住这个概念。没有问题,您确实有了一个良好的开端,因为您已经面临自定义适配器:)