在展开列表视图中的组中单击按钮时随机绘制的按钮图像

button image drawn at random upon button click in the group in the expandlistview

我有一个扩展列表视图,其中包含一个关于组的按钮。当我单击按钮时,它应该保存与按钮关联的数据,并且还必须根据按钮的值重绘按钮。我遇到的问题是它不仅重绘自身,而且重绘其他一些按钮。很难理解和解释正在发生的事情,因为它似乎随机重绘任何按钮。 请注意保存部分工作正常。

谁能告诉我,下面这段代码有什么问题。 我唯一想要实现的是重绘仅被点击的按钮,而不是 expandlistview 中的任何其他按钮。

 groupHolder.Favourite.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {
            String itemKey = Holder.Favourite.getTag().toString();
            Boolean starred = Client.data.get(itemKey.toLowerCase());
            Client.writeStarred(view.getContext(), itemKey.toLowerCase(), starred);

            if (starred)
                ((ImageButton) view).setImageDrawable(view.getContext().getResources().getDrawable(R.drawable.ic_cat_star_yellow));
            else
                ((ImageButton) view).setImageDrawable(view.getContext().getResources().getDrawable(R.drawable.ic_cat_star));
        }
    });

部分getGroupView

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        GroupViewHolder Holder;
        final GroupEvent group = (GroupEvent) getGroup(groupPosition);
        if (group.Starred)
            Holder.Favourite.setImageDrawable(convertView.getContext().getResources().getDrawable(R.drawable.ic_cat_star_yellow));
});

我已将代码更改为以下内容以添加 notifyDataSetChanged(); ,但这似乎也行不通。

groupHolder.ButtonFavourite.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {
            String itemKey = gpHolder.ButtonFavourite.getTag().toString();
            Boolean starred = Client.data.get(itemKey.toLowerCase());
            Client.writeStarred(view.getContext(), itemKey.toLowerCase(), starred);
            notifyDataSetChanged();
        }
    });

由于视图回收,视图正在随机重绘按钮。

对于适配器视图,事件处理程序应该用于更新模型状态,getView() [或对于 ExpandableListViewgetGroupView()getChildView()] 应该呈现视图基于那个状态。

getGroupView() 中,检查项目的星标标志并相应地设置您的图像可绘制。

确保将视图视为 "dirty",因为它可能会被回收并每次都显式设置图像可绘制值:

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    GroupViewHolder Holder;
    final GroupEvent group = (GroupEvent) getGroup(groupPosition);
    ...
    Holder.Favourite.setImageDrawable(convertView.getContext().getResources().getDrawable(
        group.Starred ? R.drawable.ic_cat_star_yellow : R.drawable.ic_cat_star));                
}