我有一个包含不同布局的行的ListView。所以我使用了ViewHolder的模式。
如果用户点击一行,则必须显示/隐藏同一行的一个子布局。
viewHolder.btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int) v.getTag();
Log.d(TAG, "Line in position " + position + " clicked");
if (!checkBoxSendChoice[position]) {
checkBoxSendChoice[position] = true;
viewHolder.layout_choice.setVisibility(View.VISIBLE);
} else {
checkBoxSendChoice[position] = false;
viewHolder.layout_choice.setVisibility(View.GONE);
}
}
});
但是我注意到整个ListView被刷新(因为setVisibility(),所有行都会多次调用getView)。如果我注释掉两个setVisibility()指令,ListView就不会再刷新。
是否可以优化并避免刷新ListView中的所有视图?
答案 0 :(得分:0)
我认为有更好的方法可以做到这一点。您不应直接编辑视图,而应在列表项中包含Boolean isVisible
并进行更改,然后通知适配器项已更改。这将使持有者重新绑定到该项目。在持有者的绑定功能中,您可以设置视图的可见性取决于布尔值。这是一个粗略的例子(半伪代码):
List<MyItem> items;
viewHolder.btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int) v.getTag();
Log.d(TAG, "Line in position " + position + " clicked");
checkBoxSendChoice[position] != checkBoxSendChoice[position];
items.get(position).isVisible = heckBoxSendChoice[position];
adapter.notifyItemRangeChanged(position, 1);
}
});
class MyItem {
boolean isVisible = true;
}
class holder {
View layout_choice;
private void onBind(MyItem item) {
if (item.isVisible) {
layout_choice.setVisibility(View.VISIBLE);
} else {
layout_choice.setVisibility(View. GONE);
}
}
}
通过使用notifyItemRangeChanged通知适配器,适配器将知道哪些项目已更新,因此只会刷新它们。 如果您希望我能够通过一个经过测试的实例来编辑我的答案。希望这有帮助!