2015-10-13 42 views
0

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

任何人都可以告诉我,下面这段代码有什么问题。 我想要实现的唯一的事情是重绘仅被点击的按钮,而不是在expandlistview中的任何其他按钮。的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)); 
}); 

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)); 
     } 
    }); 

第I部分已经改变的代码为以下来添加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(); 
     } 
    }); 

回答

0

视图由于视图回收而随机重绘按钮。

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

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

确保你把你的观点为“脏”,因为它可以被回收,并明确每一次设置图像绘制值:

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

感谢@kris拉尔森,你能不能给我一个例子,如何做到这一点,我已经添加了GetView代码。我该如何做该项目已被标记的标志,并且notifyDataSetChanged() – titimoon

+0

我已经添加了notifyDataSetChanged();但这似乎并没有重新绘制群组... – titimoon

+0

查看我的更新回答。您应该使用'onGroupClick()',并且在'getGroupView()'中显式设置drawable,因为视图可以被回收。 –

相关问题