2012-10-14 11 views
9

Mam GridView z każdą komórką zawierającą tekst i chcę mieć możliwość ustawienia koloru tła poszczególnych komórek.Jak ustawić kolor tła poszczególnych komórek widoku siatki

XML dla mojego GridView jest:

<GridView android:id="@+id/students_grid" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:numColumns="6" 
      android:gravity="center" 
      android:stretchMode="columnWidth"> 
</GridView> 

Kod dla mojego GridView jest:

GridView gridView = (GridView) findViewById(R.id.students_grid); 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, student_array); 
gridView.setAdapter(adapter); 

Miałem nadzieję, że będę mógł ustawić kolor tła poszczególnych komórek przy użyciu:

gridView.getChildAt(random_student).setBackgroundColor(Color.parseColor("#18A608")); 

Jednak powoduje to wyjątek wskaźnika pustego, a po dokładniejszym zbadaniu wydaje się, że gridv iew.getChildCount() zwraca 0. Widziałem, że gridview.getCount poprawnie zwraca liczbę elementów w widoku siatki, ale to nie pomaga mi ustawić koloru tła poszczególnych komórek.

Jakieś pomysły, gdzie pójdę dalej?

Odpowiedz

-1

Należy utworzyć niestandardowy układ i użyć go w adapterze zamiast android.R.layout.simple_list_item_1. Na przykład:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" 
    android:paddingRight="?android:attr/listPreferredItemPaddingRight" 
    android:minHeight="?android:attr/listPreferredItemHeightSmall" 
    android:background="#18A608" 
    /> 

(po prostu kopiowane z najnowszej wersji simple_list_item_1.xml i dodano nowy kolor tła na końcu.)

Zapisz jako grid_layout.xml w res/layout i zmienić konstruktora Twojego adaptera do:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.grid_layout, student_array); 
+0

Dzięki. Działa to w celu zainicjowania wszystkich komórek podczas tworzenia ekranu. Ale muszę też dynamicznie uzyskiwać dostęp i zmieniać komórki. Czy istnieje sposób na odwołanie się do poszczególnych komórek w czasie wykonywania w celu zmiany ich koloru? –

+0

(Przepraszam, właśnie znalazłem twoją odpowiedź.) Tak, ale czy chcesz podświetlić tylko jedną komórkę lub każdą komórkę, która pasuje do kryteriów (jak co trzecia komórka lub każdy uczeń, który się nie sprawdza)? – Sam

+0

@Mark__C tak, przesłonić BaseAdapter zgodnie z sugestią w SDK. – dcow

7

Kluczem do rozwiązania tego problemu jest zrozumienie, jak działa ListView i GridView. GridView tworzy i niszczy widoki podrzędne podczas przewijania w górę iw dół. Jeśli nie widzisz elementu w GridView, co oznacza, że ​​nie ma dla niego widoku podrzędnego, zostanie on utworzony, gdy użytkownik faktycznie przewinie do niego. GridView używa Adapter do tworzenia widoków, a GridView przetwarza widoki, gdy znikają z ekranu i prosi adaptera o ponowne wykorzystanie odzyskanych widoków dla nowych widoków, które pojawiają się na ekranie. Model Adapter zwykle nadpisuje układ zasobów, aby utworzyć nowe widoki.

Więc oznacza to, że GridView wezwie getView(...) na Adapter każdym razem, gdy chce wyświetlić widok dziecka na ekranie, może przekazać do recyklingu Zobacz nazywa convertView.

Rozwiązaniem jest przesłonić getView(...), zadzwoń Super pozwolić Adapter tworzyć i wypełniać widok z danymi z tablicy String normalnie, ale dodać trochę kodu na końcu przed dajemy widoku Powrót do GridView który ustawia kolor widoku.

new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, student_array) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View view = super.getView(position, convertView, parent); 

    int color = 0x00FFFFFF; // Transparent 
    if (someCondition) { 
     color = 0xFF0000FF; // Opaque Blue 
    } 

    view.setBackgroundColor(color); 

    return view; 
    } 
}; 
3

Główna działalność gdzie trzeba stworzyć tablicę szesnastkowy kod koloru i i przejść do niestandardowej klasy adaptera

public class MainActivity extends Activity { 
GridView gridView; 


    String[] gridColor ={ 

      "#008B8B", 
      "#00FF00", 
      "#48D1CC", 
      "#556B2F", 
      "#696969", 
      "#6B8E23", 
      "#8FBC8F", 
      "#AFEEEE", 
      "#B8860B", 
      "#BDB76B", 
      "#D8BFD8", 
      "#DEB887", 
      "#FFFF00", 
      "#FFF0F5", 
      "#EE82EE", 
      "#DC143C", 
      "#C0C0C0" 
    }; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Grid adapter = new Grid(MainActivity.this,gridColor); 
     gridView=(GridView)findViewById(R.id.grid_view); 

     gridView.setAdapter(adapter); 


     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) 
      { 
       Toast.makeText(MainActivity.this, "You Clicked On " +gridcolor[+ position], Toast.LENGTH_SHORT).show(); 

      } 
     }); 

    } 

} 

W niestandardowego kodu adaptera będzie jak ta, gdzie będzie analizowany kod koloru

public class Grid extends BaseAdapter { 

    private Context mContext; 
    private final String[] menu; 
    private final int[] Imageid; 
    private final String[] gridcolor; 

    public Grid(Context context,String[] menu,int[] Imageid,String[] gridcolor) 
    { 
     mContext=context; 

     this.gridcolor=gridcolor; 
    } 

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

    @Override 
    public Object getItem(int i) { 
     return null; 
    } 

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

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     View grid; 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (view == null) { 

      grid = new View(mContext); 
      grid = inflater.inflate(R.layout.grid_layout, null); 

      grid.setBackgroundColor(Color.parseColor(gridcolor[i])); 

     } else 
     { 
      grid = view; 
     } 

     return grid; 
    } 
} 
Powiązane problemy