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

Android:ListView更改错误的行布局可见性,android,listview,Android,Listview,我有上百个项目的列表视图。每个项目都有几个线性布局,但其中一个是可见性。消失了!每个项目都有文本视图和图像。在“图像”上单击“我想设置具有可见性的线性布局”。转到“视图.可见”。它可以正常工作,直到你向下滚动listview,然后每四个项目都有相同的布局设置为可见,但我只需要点击一个!下面是getView方法: @Override public View getView(final int position, View convertView, ViewGroup parent) { f

我有上百个项目的列表视图。每个项目都有几个线性布局,但其中一个是可见性。消失了!每个项目都有文本视图和图像。在“图像”上单击“我想设置具有可见性的线性布局”。转到“视图.可见”。它可以正常工作,直到你向下滚动listview,然后每四个项目都有相同的布局设置为可见,但我只需要点击一个!下面是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;
}

这是因为您正在循环使用视图,所以布局会在单击时更改,然后在其他行中使用该布局以节省内存

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

有这样的东西:

public View getView(final int position, View convertView, ViewGroup parent) {
...
if (shouldBeVisible.get(position)) {
    hiddenLayout.setVisibility(View.VISIBLE);
} else {
    hiddenLayout.setVisibility(View.GONE);
}
这样,布局将始终以某种方式设置

shouldbeevisible
是一个
列表
,它让您知道哪些行的布局应该可见或不可见

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

你可以把这条线移走
if(convertView==null)


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

阅读这篇文章正是提醒我重用视图的需要。我不明白为什么来自其他列表项的数据会跳到我的ListView的顶部。