Как установить фон для рисования на элементе GridView, на который нажали, в Android? - PullRequest
4 голосов
/ 23 сентября 2011

У меня есть GridView с кучей иконок, и мне нужно выбрать один.И под выбором я подразумеваю:

  • Мне нужен нарисованный идентификатор для сохранения в базе данных (чтобы я мог получить к нему доступ позже)
  • Мне нужно нарисовать какой-то визуальный сигнал насетка, чтобы сообщить пользователю, какой значок выбран в данный моментне используйте его, чтобы выбрать саму иконку или нарисовать визуальную подсказку.Я знаю положение элемента сетки в onItemClickListener и могу сохранить его как переменную частного класса.Моя самая большая проблема - нарисовать эту визуальную подсказку.

    Как мне этого добиться?Как нарисовать визуальную подсказку на элементе, по которому щелкнули, и, если пользователь щелкает разные элементы, отменить эту визуальную подсказку и перерисовать ее в новом элементе?

Ответы [ 2 ]

4 голосов
/ 24 сентября 2011

Поработав с этим пару часов, я, наконец, нашел решение, которое искал. Хотя ответы практически не связаны, первоначальные изменения в решении Ian помогли мне найти это решение:)

Я не собираюсь объяснять все, что я сделал, я думаю, это довольно очевидно. Несколько замечаний:

  • Сначала я попробовал view.Invalidate() и view.postInvalidate() вместо iconAdapter.notifyDataSetChanged(), но ни один из них не работал. В документации говорится, что недействительные методы только «просили» перерисовать представление «когда это возможно».

  • Я искал более простое решение, чем объединение двух элементов. Например, нарисуйте значок на 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);
    }

}
1 голос
/ 23 сентября 2011

Я полагаю, что если вы хотите какой-то сигнал выбора, вам нужен фокусируемый объект. Тем не менее, с фокусируемым объектом (таким как кнопка), присоединение OnItemClickListener к GridView не работает (если я правильно помню). Скорее, вы должны индивидуально прикрепить OnClickListener к каждому элементу в getView () в адаптере.

адаптер:

// 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;
    }
}

На стороне активности, кнопка сохранения на ClickListener:

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

       // now safe all stuff to database
}

Возможно, отсутствуют детали, потому что кнопка фокусируется, но я думаю, что так и должно быть. Кроме того, вы добьетесь выбора, используя определенный XML-ресурс селектора. Это, однако, следует рассмотреть в отдельном вопросе.

Редактировать 1: На самом деле, теперь, когда я думаю об этом, я не уверен, может ли быть нарисованный .xml (селектор) с идентификатором. Позже мне придется реализовать это дома и попробовать.

Редактировать 2: Я добавил часть sharedPreference

Редактировать 3: Добавлен запрос стороны активности для sharedPreference.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...