Android:ListView更改错误的行布局可见性

时间:2013-06-11 18:47:47

标签: android listview

我有一百个项目的listview。每个项目都有一些LinearLayouts,但其中一个是Visibility.GONE!每个项目都有文本视图和图像。在图像上单击我想将LinearLayout设置为visibility.Gone为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;
}

1 个答案:

答案 0 :(得分: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的东西,可以让您知道哪些行应该有可见的布局。

EDIT-- 另一种方法是删除视图回收,但这会严重影响性能,不应该这样做,但我只是在解释列出所有选项。

你会删除该行 if (convertView == null)

让Android始终为新视图充气,而不是在可能的情况下使用回收的视图。