Android ListView和行回收问题
我有这个列表视图: 我正在使用自定义适配器 如您所见,每行由一个复选框、一个大文本视图和一个小文本视图组成。 所有条目都定义了小文本视图,甚至“条目2”,但它是一个空字符串 当我点击列表标题中的EditText时,问题出现了: 键盘出现,行被回收,因此我的适配器的getView方法被调用。在该方法中,我有一个if子句,其中我检查“可选”文本(LittleTextView)的长度是否大于0。在这种情况下,我会腾出一些空间(你可以在截图中看到的空间)并显示出来 问题是“项目2”初始化了“可选”文本,但它是无效的(0大小)。我不明白为什么执行if子句。但更奇怪的是。。。else也被执行了!在else中,我只是在小文本视图中显示一个空字符串 为什么会这样?这个应用程序非常简单。这是我的getView方法:Android ListView和行回收问题,android,Android,我有这个列表视图: 我正在使用自定义适配器 如您所见,每行由一个复选框、一个大文本视图和一个小文本视图组成。 所有条目都定义了小文本视图,甚至“条目2”,但它是一个空字符串 当我点击列表标题中的EditText时,问题出现了: 键盘出现,行被回收,因此我的适配器的getView方法被调用。在该方法中,我有一个if子句,其中我检查“可选”文本(LittleTextView)的长度是否大于0。在这种情况下,我会腾出一些空间(你可以在截图中看到的空间)并显示出来 问题是“项目2”初始化了“可选”文
@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;
}
可以查看源代码(github)。当您修改回收视图时,您不知道该视图的状态是什么,也不知道以前调用
getView
时该视图可能是如何定制的。您正在回收的视图不是R.layout.list\u行
的新开箱即用视图。将其视为“二手”或“二手”视图
因此,我可以在
if(list\u item.hasportional()…
下看到您对item\u title.getLayoutParams()
进行了一些修改。因为此处创建的视图稍后可能会被循环用于无法通过检查的列表项if(list\u item.hasportional())
在else
代码块下,您必须将修改的值重置为布局中指定的默认值。因此,我必须回滚在else中if语句中修改的值…是因为这个原因,if和else似乎同时执行?我的意思是,在else中,我必须执行与t相反的操作如果是的。我说的对吗?我的疑问是:为什么当我点击文本编辑时,if和else语句似乎是同时执行的?在else子句中,你确实必须执行与if子句相反的操作。而if和else不能同时执行。@Romain:是的,我知道,但在这种情况下,似乎两者都是在出现了e键盘。if子句腾出了一些空间,else只是将文本设置为空字符串,这两种行为都被应用。这就是我的疑问…为什么?只执行其中一个不是更好吗?我如何才能完成?它们不能同时执行。您的代码中犯了错误。