2013-06-11 39 views
0

我有listview百项。每个项目都有一对LinearLayouts,但其中一个是Visibility.GONE!每个项目都有文字浏览和图像。在图像点击我想设置LinearLayout visible.Gone to View.VISIBLE。它工作正常,直到你向下滚动列表视图,然后每个第4项具有相同的布局设置为可见,但我只需要单击一个!这里是getView方法:Android:ListView改变错误的行布局的可见性

@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; 
} 

回答

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总是夸大一个新的观点,而不是尽可能使用再生一个。

+0

谢谢你,第一个与列表工作很好。 – user2475805

+0

读这正是我需要提醒我的意见重用。我无法弄清楚为什么其他列表项的数据跳到我的ListView的顶部。 – Cyrille