Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未应用对视图的编程更改_Java_Android - Fatal编程技术网

Java 未应用对视图的编程更改

Java 未应用对视图的编程更改,java,android,Java,Android,我制作了一个包含联系人朋友的列表,用户可以通过点击来选择他们。如果选择了一个人,列表项的背景颜色将改变,如果取消选择,背景颜色将消失。 问题是,当我在OnClickListener上调用我的方法时,一切正常。 然而,当我在一个循环中调用它给已经选定的朋友着色时,例如,当重新访问列表时,它不会着色 通过元素调用colorize(如果需要)的循环: for (int i = 0; i < adapter.getCount();i++){ ContactFriend cf = (Cont

我制作了一个包含联系人朋友的列表,用户可以通过点击来选择他们。如果选择了一个人,列表项的背景颜色将改变,如果取消选择,背景颜色将消失。 问题是,当我在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();
}
这个问题很奇怪,我不知道该怎么做才能使它正确。如果这很重要的话,整个组都是从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}"