为什么在视图上调用setBackgroundColor会破坏其长按颜色更改并突出显示?

fin*_*oop 4 android listview view

在Android中,默认情况下,当您长按单击列表项时,它会从突出显示颜色变为白色,表示用户已将其按下并显示上下文项.此外,您可以使用轨迹球(或某些手机上的箭头按钮)选择列表项,而不是使用手指.

但是,我有一个ListView,其项目的视图我正在调用setBackgroundColor,并且这两个预期的行为都不再起作用.有谁知道这是为什么以及如何解决它?

注意:在xml中设置背景颜色不是一个选项,因为我需要能够动态设置/更改颜色.

我的newView函数的代码如下:

@Override
public View newView(Context ctx, Cursor cursor, ViewGroup parent)
{
    View view = new View(mCtx);
    final LayoutInflater li = (LayoutInflater) mCtx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = li.inflate(R.layout.task_list_item, null);

    return view;
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*Lee 9

默认情况下,ListView有一个在长按列表项时Selector会播放TransitionDrawable.但是,如果列表项视图具有纯色背景,那么您将无法看到选择器的长按动画(或任何其他状态),因为它被列表项的背景所掩盖.

如果要查看选择器的长按动画/选择/按下状态,则在选择/按下/按下项目时,列表项必须具有透明背景.您可以使用StateListDrawable作为项目的背景而不是纯色来实现.

以下是StateListDrawable的示例:

public class ColorfulListItemDrawable extends StateListDrawable {
    private final PaintDrawable mColor;

    public ColorfulListItemDrawable(int color) {
        mColor = new PaintDrawable(color);
        initialize();
    }
    private void initialize() {
        Drawable color = mColor;
        Drawable selected = new ColorDrawable(Color.TRANSPARENT);
        addState(new int[] {android.R.attr.state_pressed, android.R.attr.state_enabled, 
                android.R.attr.state_window_focused}, selected);
        addState(new int[] {android.R.attr.state_pressed, android.R.attr.state_enabled, 
                android.R.attr.state_window_focused,android.R.attr.state_selected}, selected);
        addState(new int[] {android.R.attr.state_enabled,android.R.attr.state_window_focused, android.R.attr.state_selected}, selected);
        addState(new int[] {}, color);
    }
    public void setColor(int color) {
        mColor.getPaint().setColor(color);
        mColor.invalidateSelf();
    }   
}
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 5

设置背景颜色时,您将覆盖默认背景,这似乎是一种颜色动画.如果您想要不同的颜色,则必须使用所需的颜色创建动画.