我有一百个项目的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;
}
答案 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始终为新视图充气,而不是在可能的情况下使用回收的视图。