Java 未应用对视图的编程更改
我制作了一个包含联系人朋友的列表,用户可以通过点击来选择他们。如果选择了一个人,列表项的背景颜色将改变,如果取消选择,背景颜色将消失。 问题是,当我在OnClickListener上调用我的方法时,一切正常。 然而,当我在一个循环中调用它给已经选定的朋友着色时,例如,当重新访问列表时,它不会着色 通过元素调用colorize(如果需要)的循环:Java 未应用对视图的编程更改,java,android,Java,Android,我制作了一个包含联系人朋友的列表,用户可以通过点击来选择他们。如果选择了一个人,列表项的背景颜色将改变,如果取消选择,背景颜色将消失。 问题是,当我在OnClickListener上调用我的方法时,一切正常。 然而,当我在一个循环中调用它给已经选定的朋友着色时,例如,当重新访问列表时,它不会着色 通过元素调用colorize(如果需要)的循环: for (int i = 0; i < adapter.getCount();i++){ ContactFriend cf = (Cont
for (int i = 0; i < adapter.getCount();i++){
ContactFriend cf = (ContactFriend) adapter.getItem(i);
View v = getViewByPosition(i,listView);
colorizeFriendBg(v, cf);
adapter.notifyDataSetChanged();
}
这个问题很奇怪,我不知道该怎么做才能使它正确。如果这很重要的话,整个组都是从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();
}
});
您需要在视图上调用invalidate以使颜色更改可见
invalidate强制使用新颜色重新绘制。您从适配器获得的是什么类型的项目视图
该视图可以/应该实现颜色化和颜色本身
例如:v.colorizecontact.isSelected可切换颜色
或者使用XML,其中viewModel是Contact的实例:
类联系人只需要属性isSelected的getter和setter
实际上,还可以绑定事件处理程序,这是另一种方法。为什么不将colorize方法放在适配器中?应该更容易,因为我是Android的初学者:D谢谢你的提示,尽管我会这么做。你认为这会有助于解决这个问题吗?在一个旧项目中,我在适配器中做了这项工作,它工作正常,所以我想它会工作:为了更好地检查代码中不工作的内容,可以添加onclick完整代码吗?您也可以尝试在更改颜色后调用notifyDataSetChanged方法^^^让我知道,如果它不起作用,我可以更好地检查它。我添加了侦听器实现,但我会将着色器放在适配器上。通知更改没有帮助,但是:/v.invalidate添加在我的着色程序的末尾,仍然没有运气:/It有AppCompatitTextView。我正在把着色器移到适配器上now@agiro在视图中,它将始终为自己着色,而适配器提供项目。大多数情况下,使用的是View类型的ViewHolder。最简单的方法是数据绑定单个属性:例如:<试试本教程,根据基础数据添加类似于此的备用背景颜色应该很容易。谢谢,尽管我仍在尝试找出它为什么在侦听器上工作,为什么不在for循环中。顺便问一下,如何从适配器访问子视图?我找到的解决方案只是从外面得到的xd@agiro需要区分UI线程和后台线程;isSelected已经是对象友元的属性,在那里可以轻松地绑定数据值。。。在上面添加了一个未经测试的示例,但它应该是类似的。绑定时,我收到一个错误:错误:“@{friend.isSelected?'993399ff':'00000000'}”与属性android:textColor attr reference | color不兼容。我认为,所有的东西都应该是为了绑定而构建的:我可能不得不重新考虑这里的一些东西
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();
}
});
<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}"