Android ListView和行回收问题

Android ListView和行回收问题,android,Android,我有这个列表视图: 我正在使用自定义适配器 如您所见,每行由一个复选框、一个大文本视图和一个小文本视图组成。 所有条目都定义了小文本视图,甚至“条目2”,但它是一个空字符串 当我点击列表标题中的EditText时,问题出现了: 键盘出现,行被回收,因此我的适配器的getView方法被调用。在该方法中,我有一个if子句,其中我检查“可选”文本(LittleTextView)的长度是否大于0。在这种情况下,我会腾出一些空间(你可以在截图中看到的空间)并显示出来 问题是“项目2”初始化了“可选”文

我有这个列表视图:

我正在使用自定义适配器

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

当我点击列表标题中的EditText时,问题出现了:

键盘出现,行被回收,因此我的适配器的getView方法被调用。在该方法中,我有一个if子句,其中我检查“可选”文本(LittleTextView)的长度是否大于0。在这种情况下,我会腾出一些空间(你可以在截图中看到的空间)并显示出来

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

为什么会这样?这个应用程序非常简单。这是我的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;
}

可以查看源代码(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只是将文本设置为空字符串,这两种行为都被应用。这就是我的疑问…为什么?只执行其中一个不是更好吗?我如何才能完成?它们不能同时执行。您的代码中犯了错误。