2

我创建了名为Color的自定义视图。我使用 Color 对象来填充 GridView(同样的问题也出现在 ListView 中)。

我的任务是让用户选择一种颜色并突出显示它。

以前我做过类似的事情,但我只用于构建小部件并且一切正常。这次我用自己的。

此 cos 用于单击项目:

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    int color = (int)id;

    Log.d(TAG, "Selected color: " + id);
    view.setSelected(true);
    view.invalidate();
}

颜色.onDraw:

@Override
public void onDraw(Canvas canvas) {
    if (isSelected()) {
        Log.d(TAG, "color draw selected");
    } else {
        Log.d(TAG, "not selected " + color);
    }
}

我也设置setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);为这个 GridView (AbsListView.CHOICE_MODE_MULTIPLE也不要帮助)

在日志中我看到:

Selected color: 8355711
not selected 16711680
not selected 16743680
not selected 8355711

我敢肯定,颜色项目并没有按时重新创建。

我尝试将 GridView 更改为 ListView,用户默认小部件(仅覆盖 onDraw())。没有什么帮助。也许我忘记了什么?

在我看来,GridView 以某种方式放弃了选定的状态。

如果您需要更多信息,请告诉。

添加:

我用调试器检查过。颜色为 8355711 的视图在两个函数中是相同的对象。

我使用了 setOnItemSelectedListener(this); 跟踪项目选择。但是在这个监听器中什么也没有发生。

4

2 回答 2

2

isSelected()方法来自 GridView,它是 View 的子级。

基本上当你打电话时isSelected()说:“选择了gridview”这不是你想要的。

你想要的是:“网格视图中是否有任何选定的视图?”

这可以使用getSelectedView()来实现

如文档所述,您将获得对所选视图的引用,或者null如果未选择任何视图。

还要确保您的 GridView 已正确初始化以处理项目选择。

编辑:好的,我知道 isSelected() 是从颜色视图中调用的。我的第一个猜测是没有用的。

但我认为您应该尝试使用GridView 对象的setSelection()选择您的项目。

添加类似:

myGridView.setSelection(position);
于 2012-08-03T16:11:45.683 回答
0

我通过自己的选择解决了这个问题。它的解决方法。

在 Color 类中添加:

private boolean selected = false;

public boolean isSelected2() {
    return selected;
}

public void setSelected2(boolean selected) {
    this.selected = selected;
}

@Override
public void onDraw(Canvas canvas) { 
    ....        
    if (isSelected2()) {
        //draw selected state
    } else {
    ....
}

在 ColorChooser 网格上:

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    ...
    int i = getChildCount();
    while (--i >= 0)
        ((Color)getChildAt(i)).setSelected2(false);

    ((Color)view).setSelected2(true);
    ....
}

我不覆盖 natice 的原因setSelected(boolean state)是网格中的一些其他代码每次都使所有项目处于取消选择状态。我不知道为什么,因为在其他地方同样的本地代码工作得很好。

于 2012-08-20T09:15:57.707 回答