Пометка элемента GridView как выбранного

Я пытаюсь создать селектор иконок. Действие селектора значков открывается, когда я щелкаю значок в главном действии:

Intent intent_open_icon_picker = new Intent(Activity_Add_Edit_Trip.this, Activity_Icon_Picker.class);
intent_open_icon_picker.putExtra("SELECTED_ICON", current_icon_position);
startActivityForResult(intent_open_icon_picker, Constants.Request_Codes.REQUEST_CODE_SET_TRIP_ICON);

current_icon_position по умолчанию 0, устанавливая первый значок в массиве для ImageView.

Затем в row_grid.xml у меня есть этот код для каждой строки в GridView (обратите внимание на фон):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@drawable/grid_color_selector"
android:clickable="false"
android:focusable="false"
android:orientation="vertical"
android:padding="5dp" >

<ImageView
    android:id="@+id/image"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:scaleType="fitCenter"
    android:focusable="false"
    android:clickable="false" >
</ImageView>

</LinearLayout>

И это @drawable/grid_color_selector:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/color_BLUE" android:state_pressed="true"/>
    <item android:drawable="@color/color_BLUE" android:state_selected="true"/>
    <item android:drawable="@color/color_WHITE"/>
</selector>

Когда открывается действие выбора значков - я хочу автоматически выделить (или отметить как выбранное) текущий значок (тот, которому я соответствует current_icon_position что я передаю в Намерение). Поэтому я попробовал несколько вещей, но ни одна из них не сработала. Я пытался сделать это:

if(getIntent().getExtras()!=null)
{
    curr_icon_position = getIntent().getExtras().getInt("SELECTED_ICON");
}

grid_view = (GridView) findViewById(R.id.gv_icons);
adapter = new GridView_Adapter(this, R.layout.row_grid, get_icons(), curr_icon_position);
grid_view.setAdapter(adapter);
**grid_view.setSelection(curr_icon_position);**

Затем я попытался сделать логический флаг в моем объекте Trip_Icon и установить его так:

private ArrayList get_icons() {
    final ArrayList arr_trip_icons = new ArrayList();
    TypedArray imgs = getResources().obtainTypedArray(R.array.trip_icons_blac);
    for (int i = 0; i < imgs.length(); i++) {
        Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),
                imgs.getResourceId(i, -1));
        Trip_Icon current_icon = new Trip_Icon(bitmap);
        **if(i==curr_icon_position)
        {
            current_icon.setSelected(true);
        }**
        arr_trip_icons.add(current_icon);
    }
    imgs.recycle();

    return arr_trip_icons;

}

и в моем адаптере сделать что-то подобное:

public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ViewHolder holder;

    if (row == null) {
        holder = new ViewHolder();
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layout_resource_id, parent, false);
        holder.image = (ImageView) row.findViewById(R.id.image);
        row.setTag(holder);
    } else {
        holder = (ViewHolder) row.getTag();
    }

    Trip_Icon icon = (Trip_Icon) data.get(position);
    holder.image.setImageBitmap(icon.getImage());
    **if(icon.isSelected())
    {
        row.setSelected(true);
    }**

    return row;
}

Но, как я уже сказал, я никогда не вижу значок выделенным.

Просто чтобы быть яснее, это то, что я хочу сделать - если current_icon_position 0, тогда я хочу, чтобы первый элемент в GridView был выделен, как на картинке:

введите описание изображения здесь

Что я делаю неправильно и как сделать так, чтобы текущая иконка была выделена?

1 ответ

В конце концов, после многих, многих попыток и ошибок, похоже, мне удалось решить эту проблему. Может быть, это решение будет полезно кому-то еще:

Прежде всего я добавил эту строку в мой GridView:

android:choiceMode="singleChoice"

Затем я добавил эту строку в мой @drawable/grid_color_selector:

<item android:drawable="@color/color_BLUE" android:state_activated="true"/>

И, наконец, в своей активности выбора значков я добавил эту строку после того, как для адаптера было установлено значение Grid_view:

grid_view.setItemChecked(curr_icon_position, true);

А также curr_icon_positionКак я уже говорил в вопросе, передается в качестве намерения дополнительно.

Другие вопросы по тегам