我制作了一个载有联系人朋友的列表,用户可以通过点击它们来选择它们。如果选择了某个人,则listitem的backgorund会改变颜色,如果取消选择,则bg着色消失。
问题是,当我在OnClickListener
上调用我的方法时,它很好。
然而,当我在循环中调用它来为已经选择的朋友着色时(例如,当重新访问列表时),它不会进行着色。
如果需要,通过元素调用colorize
的循环:
for (int i = 0; i < adapter.getCount();i++){
ContactFriend cf = (ContactFriend) adapter.getItem(i);
View v = getViewByPosition(i,listView);
colorizeFriendBg(v, cf);
adapter.notifyDataSetChanged();
}
注意我在侦听器中完全相同,并且在那里工作正常。
着色剂:
private void colorizeFriendBg(View v, ContactFriend friend){
if(friend.isSelected()){
v.setBackgroundColor(0x993399ff);
}else{
v.setBackgroundColor(0x00000000);
}
v.invalidate();
}
这个问题很奇怪,我不知道该怎么做才能使它正确。如果重要的话,整个群体都会从onActivityCreated
调用。
编辑:
我当然调试了它,代码运行并且应该改变颜色,不运行不是问题。
再次编辑:
这是监听器实现:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ContactFriend fr = (ContactFriend) adapter.getItem(position);
addToSelected(fr);
//TODO: make it switch some BG colour when clicked. use getViewByPosition.
View v = getViewByPosition(position,listView);
colorizeFriendBg(v,fr);
adapter.notifyDataSetChanged();
}
});
答案 0 :(得分:1)
您从View
获得的Adapter
项目类型是什么?
View
可以/应该实现colorize()
并为自身着色;
例如:v.colorize(contact.isSelected())
来切换颜色。
或Android Data-Binding XML(其中viewModel是Contact
的实例):
<data class="com.acme.databinding.ContactViewHolderBinding">
<variable name="viewModel" type="com.acme.model.Contact"/>
</data>
...
android:backgroundColor="@{viewModel.isSelected ? R.color.MAGENTA : R.color.BLACK}"
类Contact
只需要一个getter 和属性isSelected
的setter。
实际上也可以绑定事件处理程序,这将是一种替代方法。
答案 1 :(得分:0)
您需要在视图上调用export const FileHelper = {
downloadFile(data: Response): void {
const fileURL = URL.createObjectURL(data);
window.open(fileURL);
}
};
以使颜色更改可见。
invalidate()
强制重新绘制新颜色。