不应用对视图的编程更改

时间:2017-11-20 11:25:05

标签: java android

我制作了一个载有联系人朋友的列表,用户可以通过点击它们来选择它们。如果选择了某个人,则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();
        }
    });

2 个答案:

答案 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()强制重新绘制新颜色。