2

Colorというカスタム ビューを作成しました。Color のオブジェクトを使用して GridView を塗りつぶします (同じ問題が ListView にもあります)。

私の仕事は、ユーザーが 1 つの色を選択して強調表示できるようにすることです。

以前はそのようなことをしていましたが、ウィジェットの構築にのみ使用し、すべてが機能しました。今回は自前のものを使用。

このコードはアイテムのクリック用です:

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();
}

Color.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()は、Viewの子であるGridViewから来ています。

基本的に、電話をかけるときisSelected()は、「グリッドビューが選択されていますか」と言っていますが、これは希望するものではありません。

必要なのは、「グリッドビューに選択されたビューはありますか?」です。

これは、 getSelectedView()を使用して実現できます

ドキュメントに記載されているように、選択したビューへの参照が表示nullされます。選択されていない場合は参照が表示されます。

また、GridViewがアイテムの選択を処理するように適切に初期化されていることを確認してください。

編集:わかりました。isSelected()がカラービューから呼び出されることを理解しました。私の最初の推測はそれでは役に立たない。

ただし、GridViewオブジェクトのsetSelection()を使用してアイテムを選択するようにしてください。

次のようなものを追加します。

myGridView.setSelection(position);
于 2012-08-03T16:11:45.683 に答える