gpt4 book ai didi

android - ListView和行回收问题

转载 作者:行者123 更新时间:2023-11-29 00:47:10 24 4
gpt4 key购买 nike

我有这个 ListView:

enter image description here

我正在使用自定义适配器。

如您所见,每一行都由一个复选框、一个大 TextView 和一个小 TextView 组成。所有项目都定义了小 TextView,甚至是“项目 2”,但它是一个空字符串。

当我点击放置在列表标题中的 EditText 时出现问题:

enter image description here

键盘出现,行被回收,所以我的adapter的getView方法被调用了。在那个方法中,我有一个 if 子句,我检查“可选”文本(小 TextView)的长度是否大于 0。在那种情况下,我腾出一些空间(你可以在屏幕截图中看到的空间)并且我显示它。

问题是“项目 2”初始化了“可选”文本,但它是空的(0 大小)。我不明白为什么要执行 if 子句。但更奇怪的是……else也被执行了!在其他情况下,我只是在小 TextView 中显示一个空字符串。

为什么会这样?该应用程序非常简单。这是我的 getView 方法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.list_row, null);
}

ListItem list_item = items.get(position);

TextView item_title = (TextView) convertView.findViewById(R.id.item_title);
TextView item_optional = (TextView) convertView.findViewById(R.id.item_optional);

item_title.setText(list_item.getTitle());

// If the task has an optional text, make some room and display it
if (list_item.hasOptional()) {
// This portion of code will be executed when you tap the EditText and the keyboard appears, putting the item up in the row
LayoutParams layout_params = (LayoutParams) item_title.getLayoutParams();
layout_params.topMargin = 10;
layout_params.height = -2; // -2: wrap_content
item_title.setLayoutParams(layout_params);
item_optional.setText(list_item.getOptional());
item_optional.setVisibility(0);
} else {
// This portion of code will ALSO be executed when you tap the EditText... why? this should not happen!
item_optional.setText("");
}

return convertView;
}

源码可见here (github)。

最佳答案

当您修改回收 View 时,您不知道 View 的状态是什么,也不知道它可能是如何通过之前调用 getView 进行自定义的。您正在回收的 View 不是 R.layout.list_row 的全新开箱即用的膨胀。将其视为“二手”或“用过”的 View 。

所以我可以在 if (list_item.hasOptional().. 下看到您对 item_title.getLayoutParams() 进行了一些修改。因为此处创建的 View 可能稍后会出现被循环用于将无法通过检查的列表项 if (list_item.hasOptional()else 代码块下 您必须将修改的值重置为布局。

关于android - ListView和行回收问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5766907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com