【问题标题】:Android ListView Adapter getView is not working as expectedAndroid ListView 适配器 getView 未按预期工作
【发布时间】:2018-05-03 17:11:07
【问题描述】:

我使用此tutorial 来创建自定义列表视图,但由于某种原因,它的行为与我的预期不同。

这是我更改并当前用于适配器的代码:

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 上的代码正在运行 3 次。

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

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

【问题讨论】:

  • 将else部分添加到if(viewHolder.itemLabel.getText().equals("Fat"))。如果运行 3 次就可以了。通常getView() 在第一次创建适配器时会调用几次。
  • 为什么需要添加else?代码运行3次没有问题,唯一的问题是它把图标放在了错误的textviews上。
  • placing the icon on wrong textviews?这就是为什么您需要 else 部分将其设置为默认值的原因。阅读convertViewgetView() 中的角色。
  • @GuiFGDeo 能否请您分享屏幕短片,以便我们轻松解决。
  • 我认为是因为回收视图行为。它使用先前创建的视图并添加为新视图。如果您不清除图标,则将添加回收视图中的图标

标签: android listview adapter


【解决方案1】:

你需要在getView()里面添加else部分。

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;
}

ConvertView 参数是您之前从getView() 返回的 View 的回收实例。您只需搜索即可阅读。
做一些快速的点。您没有在代码中正确使用视图模式。正确使用它在列表视图中查找 ViewHolder 模式。除此之外,您应该移至 RecyclerView ListView 现在是旧版。

【讨论】:

  • 感谢您的解释。稍后我将尝试迁移到 RecyclerView,但现在对我来说太混乱了。我从没想过在 Android 上创建一个简单的自定义列表会这么难。
  • 令人困惑?不..尝试调试器。你会明白的。调试每一步,看看到底发生了什么,只是一次!!!或者只是搜索我在回答中提到的主题。
  • 不,我的意思是 RecyclerView 令人困惑哈哈哈...... developer.android 的示例代码让我有点困惑。但我会在我当前的代码上尝试调试器,看看它是怎么做的。
【解决方案2】:

请检查代码它可能会有所帮助。

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;
}

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2019-09-09
    相关资源
    最近更新 更多