4

たくさんGridViewのアイコンがあり、そのうちの1つを選択する必要があります。そして、選択するということは、次のことを意味します。

  • データベースに保存するためにドローアブルIDが必要です(後でアクセスできるように)
  • どのアイコンが現在選択されているかをユーザーに知らせるために、グリッド上にある種の視覚的な手がかりを描く必要があります

私はこれを見つけました:http:
//groups.google.com/group/android-developers/browse_thread/thread/f08a58167dbaa8c8

ですから、私setSelectionは絵の外にあると思います、そして私はそれを使ってアイコン自体を選択したり、視覚的な手がかりを描いたりすることはできません。のグリッドアイテムの位置を知っているので、onItemClickListenerそれをプライベートクラス変数として保存できます。私の最大の問題は、その視覚的な手がかりを描くことです。

どうすればそれを達成できますか?クリックしたアイテムに視覚的なキューを描画し、ユーザーが別のアイテムをクリックした場合に、その視覚的なキューを「描画解除」して新しいアイテムに再描画するにはどうすればよいですか?

4

2 に答える 2

4

これに数時間取り組んだ後、私はついに私が探していた解決策を見つけたと思います。答えはほとんど関連していませんが、Ianソリューションの最初の編集は、このソリューションを見つけるのに役立ちました:)

私がしたことすべてを説明するつもりはありません、それはかなり自明だと思います。ほんの少しのコメント:

  • 最初に試しましたがview.Invalidate()view.postInvalidate()代わりにiconAdapter.notifyDataSetChanged()どちらも機能しませんでした。ドキュメントには、invalidateメソッドは「可能な場合」にビューを再描画するように「要求」されただけであると記載されています。

  • 2つのドローアブルをマージするよりも簡単な解決策を探していました。たとえば、ImageView背景にアイコンを描画し、画像として視覚的な手がかりを描画します。奇妙な理由で、GridViewをスクロールすると、視覚的な合図が他のアイコン全体にランダムに表示され始めました。理由はわかりませんが、背景画像の上に視覚的な合図を表示するというアイデアは、私には完全に理にかなっており、それをImageView可能にします。追加のマージ方法は必要ありません。しかし、それなしでは動作させることができませんでした...

MyActivity.java

public class MyActivity extends Activity {
    private GridView mGridViewIcon;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mGridViewIcon = (GridView)findViewById(R.id.gridview_icon);
        mGridViewIcon.setAdapter(new IconAdapter(this));

        mGridViewIcon.setOnItemClickListener(new GridView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                IconAdapter iconAdapter = (IconAdapter)parent.getAdapter();

                iconAdapter.setSelectedItemPosition(position);
                iconAdapter.notifyDataSetChanged();
            }

        });
    }

}

IconAdapter.java

public class IconAdapter extends BaseAdapter {

    private int mSelectedPosition;
    private Integer[] mThumbIds;
    private int mIconSize;
    private Context mContext;

    public IconAdapter(Context context) {
        mThumbIds = AppHelper.ICON_SET.keySet().iterator().next();
        mIconSize = context.getResources().getDimensionPixelSize(R.dimen.default_icon_size);
        mContext = context;
    }

    @Override
    public int getCount() {
        return mThumbIds.length;
    }

    @Override
    public Object getItem(int position) {
        return mContext.getResources().getDrawable(mThumbIds[position]);
    }

    @Override
    public long getItemId(int position) {
        return mThumbIds[position];
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;

        if(convertView == null) {
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize));
        } else {
            imageView = (ImageView)convertView;
        }

        if(mSelectedPosition == position) {
            imageView.setImageDrawable(mergeDrawableLayers(mThumbIds[position],
                    R.drawable.ic_note_selected_mark));
        } else {
            imageView.setImageResource(mThumbIds[position]);
        }

        return imageView;
    }

    public void setSelectedItemPosition(int position) {
        mSelectedPosition = position;
    }

    private Drawable mergeDrawableLayers(int background, int overlay) {
        Drawable[] drawableLayers = new Drawable[2];

        drawableLayers[0] = mContext.getResources().getDrawable(background);
        drawableLayers[1] = mContext.getResources().getDrawable(overlay);

        return new LayerDrawable(drawableLayers);
    }

}
于 2011-09-23T20:43:03.210 に答える
1

ある種の選択キューが必要な場合は、フォーカス可能なオブジェクトが必要だと思います。ただし、フォーカス可能なオブジェクト(Buttonなど)では、OnItemClickListenerをGridViewにアタッチすることは機能しません(私が正しく覚えている場合)。むしろ、アダプタのgetView()で各アイテムにOnClickListenerを個別にアタッチする必要があります。

アダプタ:

// create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        Button button;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            button = new Button(mContext);
            // set layout params (make sure its GridView.layoutParams)
            // and other stuff

        } 
        else {
            button = (Button) convertView;
        }

        button.setBackgroundResource(mThumbIds[position]); // mThumbIds hold Resource Ids
        button.setOnClickListener(new OnClickListener() {
           onClick(View v) {
             // store directly to database here, or send it with the activity with sharedPreferences (below)

             // We need an Editor object to make preference changes.
             // All objects are from android.context.Context
             SharedPreferences settings = getSharedPreferences("MY_PREFERENCE", 0);
             SharedPreferences.Editor editor = settings.edit();
             editor.putInt("button_id", mThumbIds[position]);

             // Commit the edits!
             editor.commit();
           } 
        });
        return button;
    }
}

アクティビティ側で、ボタンonClickListenerを保存します。

onClick(View v) {
// Restore preferences
       SharedPreferences settings = getSharedPreferences("MY_PREFERENCE", 0);
       int id = settings.getInt("button_id", -1);

       // now safe all stuff to database
}

ボタンはフォーカス可能であるため、詳細が欠落している可能性がありますが、これで十分だと思います。また、.x​​mlで定義されたセレクターリソースを使用して選択を行うことができます。ただし、それは別の質問で対処する必要があります。

編集1:実際、私はそれについて考えたので、ドローアブル.xml(セレクター)がIDを持つことができるかどうかわかりません。後でこれを自宅で実装して試してみる必要があります。

編集2:sharedPreference部分を追加しました

編集3:sharedPreferenceのアクティビティ側クエリを追加しました。

于 2011-09-23T16:42:40.730 に答える