Android ListView适配器getView未按预期工作

Android ListView适配器getView未按预期工作,android,listview,adapter,Android,Listview,Adapter,我使用它来创建自定义listview,但由于某些原因,它的行为与我预期的不同 以下是我更改的代码,目前用于适配器: public View getView(int position, View convertView, ViewGroup parent) { // same code as in example with some differences in the .xml viewHolder.itemLabel.setText(info.split(";")[0]);

我使用它来创建自定义listview,但由于某些原因,它的行为与我预期的不同

以下是我更改的代码,目前用于适配器:

public View getView(int position, View convertView, ViewGroup parent) {
     // same code as in example with some differences in the .xml
    viewHolder.itemLabel.setText(info.split(";")[0]);
    viewHolder.itemDescription.setText(info.split(";")[1]);
    viewHolder.itemLabel.setOnClickListener(this);
    viewHolder.itemLabel.setTag(position);
    if(viewHolder.itemLabel.getText().equals("Fat")){
        System.out.println(info);
        System.out.println(viewHolder.itemLabel.getText());
        viewHolder.itemLabel.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.info_icon, 0);
    }
return convertView;
}
现在,由于某种原因,图标被设置为列表中的多个项目,即使标签上只有一个项目带有Fat。 打印实际上显示if上的代码运行了三次

我认为这一定与应用程序的生命周期有关,但我不确定


如果问题太模糊,我很抱歉,但我找不到更好的方法来问这个问题。

请检查代码,这可能会有所帮助

public View getView(int position, View convertView, ViewGroup parent) {
     // same code as in example with some differences in the .xml
    viewHolder.itemLabel.setText(info.split(";")[0]);
    viewHolder.itemDescription.setText(info.split(";")[1]);
    viewHolder.itemLabel.setOnClickListener(this);
    viewHolder.itemLabel.setTag(position);
    if(viewHolder.itemLabel.getText().equals("Fat")){
        System.out.println(info);
        System.out.println(viewHolder.itemLabel.getText());
        viewHolder.itemLabel.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.info_icon, 0);
    }else{
        viewHolder.itemLabel.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); 
    }
    return convertView;
}

您需要在getView中添加else部分

ConvertView参数是以前从getView返回的视图的循环实例。你可以阅读它,只要搜索一下就可以了。
快速提出一些观点。代码中未正确使用viewholder图案。正确使用它在列表视图中查找ViewHolder模式。除此之外,您应该移动到RecyclerView ListView,它现在是旧版

将else部分添加到ifviewHolder.itemLabel.getText.equalsFat。如果运行3次就可以了。通常在第一次创建适配器时多次调用getView。为什么我需要添加else?代码运行3次没有问题,唯一的问题是它将图标放置在错误的文本视图上。是否将图标放置在错误的文本视图上?这就是为什么您需要else part将其设置为默认值。阅读有关convertView在getView中的角色的信息。@GuiFGDeo能否请您分享简短的屏幕,以便我们轻松解决问题。我认为发生这种情况是因为循环视图行为。它使用以前创建的视图并添加为新视图。如果您没有清除图标,将添加回收视图中的图标谢谢您的解释。稍后我会尝试转到RecyclerView,但它现在对我来说太混乱了。我从没想过在Android上创建一个简单的自定义列表会如此困难。困惑吗?不。。尝试调试器。你会明白的。调试每一步,只需一次就可以看到到底发生了什么!!!或者只是搜索我在回答中提到的主题。不,我的意思是,RecyclerView让人困惑,哈哈哈。。。来自developer.android的示例代码让我有点困惑。但是我会在我当前的代码上尝试调试器,看看它是如何工作的。
public View getView(int position, View convertView, ViewGroup parent) {
    // same code as in example with some differences in the .xml
    if(viewHolder.itemLabel.getText().equals("Fat")){
      // Stuff
    }else{
       // Else stuff
    }
    return convertView;
}