我有一个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();
}
});
答案 0 :(得分:0)
由于视图回收,视图会随机重新绘制按钮。
对于适配器视图,应使用事件处理程序更新模型状态,getView()
[或ExpandableListView
,getGroupView()
和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));
}