首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在展开列表视图中的组中按一下按钮随机绘制的按钮图像

在展开列表视图中的组中按一下按钮随机绘制的按钮图像
EN

Stack Overflow用户
提问于 2015-10-13 11:49:33
回答 1查看 52关注 0票数 0

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

有人能告诉我,下面的代码有什么问题吗?我唯一想做的就是重新绘制只点击的按钮,而不是扩展列表视图中的任何其他按钮。

代码语言:javascript
复制
 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的一部分

代码语言:javascript
复制
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();,但这似乎也不起作用。

代码语言:javascript
复制
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();
        }
    });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-13 14:49:12

由于视图回收,视图正在随意重新绘制按钮。

对于适配器视图,事件处理程序应该用于更新模型状态和getView(),或者对于ExpandableListViewgetGroupView()getChildView(),应该根据该状态呈现视图。

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

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

代码语言:javascript
复制
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));                
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33101950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档