ListView:setvisibility()强制刷新所有行

时间:2018-04-19 15:04:47

标签: java android listview visibility android-viewholder

我有一个包含不同布局的行的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中的所有视图?

1 个答案:

答案 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通知适配器,适配器将知道哪些项目已更新,因此只会刷新它们。 如果您希望我能够通过一个经过测试的实例来编辑我的答案。希望这有帮助!