0

我有数百个项目的列表视图。每个项目都有几个线性布局,但其中一个是 Visibility.GONE!每个项目都有文本视图和图像。在图像单击上,我想将 LinearLayout 设置为具有可见性。转到 View.VISIBLE。它工作正常,直到您向下滚动列表视图,然后每个第 4 个项目都有相同的布局设置为可见,但我只需要单击的一个!这是 getView 方法:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ImageView imgForClick;
    View vi = convertView;
    if (convertView == null)
        vi = inflater.inflate(R.layout.custom_row, null);
    final LinearLayout hiddenLayout = (LinearLayout)vi.findViewById(R.id.hiddenLayout);

    imgForClick = (ImageView)vi.findViewById(R.id.imageView3);
    imgForClick.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            hiddenLayout.setVisibility(View.VISIBLE);
        }
    });
    return vi;
}
4

1 回答 1

2

那是因为您正在回收视图,因此单击时会更改布局,然后在其他行中使用该布局以节省内存。

您需要记住每一行的状态才能知道布局是否应该可见

有这样的事情:

public View getView(final int position, View convertView, ViewGroup parent) {
...
if (shouldBeVisible.get(position)) {
    hiddenLayout.setVisibility(View.VISIBLE);
} else {
    hiddenLayout.setVisibility(View.GONE);
}

这样,布局将始终以一种或另一种方式设置。

shouldBeVisible是一种List让您知道哪些行应该使该布局可见或不可见的东西。

编辑——另一种方法是删除视图回收,但是这会极大地损害性能并且不应该这样做,但我只是解释列出所有选项。

您将删除该行 if (convertView == null)

让 Android 总是膨胀一个新的视图,而不是尽可能使用回收的视图。

于 2013-06-11T18:53:06.580 回答