2013-05-12 6 views
1

В Android у меня есть GridView - каждая ячейка в GridView является ImageView. Когда пользователь нажимает на ячейку, я хотел бы, чтобы эта ячейка была «выбрана» (ее фон становится синим), а все остальные ячейки «отменить выбор» (их фоны становятся белыми).Как обеспечить изменение фона выбранной ячейки GridView?

Я осуществил следующий фон вытяжку, но она меняется только фоном, а клетка нажимается:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_pressed="true" 
     android:drawable="@drawable/iconborder_selected" /> <!-- pressed --> 
<item android:drawable="@drawable/iconborder_unselected" /> <!-- default --> 
</selector> 

EDIT: Вот мой адаптер код GridView.

class IconAdapter extends BaseAdapter { 

    private Context context = null; 
    private List<Drawable> icons = new ArrayList<Drawable>(); 

    public IconAdapter(Context context) { 
     this.context = context; 

     for (Field f : R.drawable.class.getFields()) { 
      String path = f.getName(); 
      if (path.contains("icon_")) { 
       int id = context.getResources().getIdentifier(path, "drawable", 
         context.getPackageName()); 
       Drawable drawable = context.getResources().getDrawable(id); 
       icons.add(drawable); 
      } 
     } 
    } 

    @Override 
    public int getCount() { 
     return icons.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return icons.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView iv = new ImageView(context); 
     iv.setImageDrawable(icons.get(position)); 
      iv.setBackgroundResource(R.drawable.iconborder); 
     return iv; 
    } 

} 

ответ

2

Вы должны добавить state_selected тоже:

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

    <item android:state_pressed="true" 
     android:drawable="@drawable/iconborder_pressed" /> <!-- pressed --> 

    <item android:state_pressed="false" 
     android:drawable="@drawable/iconborder_unselected" /> <!-- default --> 
</selector> 
+0

Это, кажется, ничего не делает для меня. Я добавлю свой адаптер к исходному сообщению - возможно, что-то не так с тем, как я создаю представление? – sdasdadas

+0

Попробуйте добавить явно 'state_pressed =" false "' в свой элемент по умолчанию. По моему опыту, приведенный выше код работает. –

2

Try в XML-декларации GridView поставить эти строки:

<GridView 
<!-- Some stuff here, like id, width, e.t.c. --> 
android:drawSelectorOnTop="true" 
android:listSelector="path_to_your_selector" 
/> 

и ваш селектор должен содержать что-то вроде этого:

<item android:state_pressed="true"> 
    <shape> 
     <!-- Or a drawable here --> 
    </shape> 
</item> 
<item android:state_focused="true"> 
    <shape> 
     <!-- Or a drawable here --> 
    </shape> 
</item> 
<item android:drawable="@android:color/transparent" />