2012-10-14 14 views
9

Ich habe eine GridView mit jeder Zelle, die etwas Text enthält, und ich möchte in der Lage sein, die Hintergrundfarbe einzelner Zellen zu setzen.So stellen Sie die Hintergrundfarbe einzelner Zellen ein

Die XML für meine Gridview ist:

<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> 

Der Code für meine Gridview ist:

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); 

ich gehofft hatte ich die Hintergrundfarbe der einzelnen Zellen einzustellen, wäre in der Lage verwenden:

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

Allerdings löst dies eine Nullzeiger-Ausnahme aus, und bei weiterer Überprüfung scheint es, dass Gridv iiew.getChildCount() gibt 0 zurück. Ich habe gesehen, dass gridview.getCount die Anzahl der Elemente in der Gridview korrekt zurückgibt, aber das hilft mir nicht, die Hintergrundfarbe einzelner Zellen festzulegen.

Irgendwelche Ideen, wo ich als nächstes gehe?

Antwort

-1

Sie müssen ein benutzerdefiniertes Layout erstellen und es in Ihrem Adapter anstelle von android.R.layout.simple_list_item_1 verwenden. Zum Beispiel:

<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" 
    /> 

(I kopiert einfach die neueste Version von simple_list_item_1.xml und hat eine neue Hintergrundfarbe am Ende.)

speichern als grid_layout.xml in res/layout und Ihren Adapter Konstruktor ändern:

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

Danke. Das funktioniert beim Initialisieren aller Zellen, wenn der Bildschirm erstellt wird. Aber ich muss auch auf Zellen zugreifen und dynamisch ändern. Gibt es eine Möglichkeit, einzelne Zellen zur Laufzeit zu referenzieren, um ihre Farbe zu ändern? –

+0

(Entschuldigung, ich habe gerade Ihre Antwort gefunden.) Ja, aber möchten Sie nur eine Zelle oder jede Zelle hervorheben, die einem Kriterium entspricht (wie jede dritte Zelle oder jeder Schüler, der versagt)? – Sam

+0

@Mark__C Ja, überschreiben Sie BaseAdapter wie im SDK vorgeschlagen. – dcow

7

Der Schlüssel zur Lösung dieses Problems ist zunächst zu verstehen, wie ListView und GridView arbeiten. GridView erstellt und zerstört untergeordnete Ansichten, wenn Sie nach oben oder unten scrollen. Wenn Sie ein Element in einem GridView nicht sehen, das bedeutet, dass es keine untergeordnete Ansicht für es gibt, wird es erstellt, wenn der Benutzer tatsächlich zu es scrollt. GridView verwendet eine Adapter zum Erstellen der Ansichten und GridView recycelt Ansichten, wenn sie nicht auf dem Bildschirm angezeigt werden, und fordert den Adapter auf, die wiederverwerteten Ansichten für neue Ansichten wiederzuverwenden, die auf dem Bildschirm angezeigt werden. Die Adapter bläst normalerweise ein Ressourcenlayout auf, um neue Ansichten zu erstellen.

Also das, was bedeutet, dass GridViewgetView(...) auf der Adapter jedes Mal nennen sie will ein Kind Ansicht auf dem Bildschirm angezeigt werden, kann es eine Recycling-Ansicht passieren convertView genannt.

Die Lösung ist getView(...) außer Kraft zu setzen, super rief die Adapter erstellen und füllen Sie die Ansicht mit Daten aus dem String Array normalerweise aber fügen Sie ein Stück Code am Ende zu lassen, bevor wir den Blick zurück auf GridView geben, die die Farbe setzt von der Aussicht.

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

Haupttätigkeit in dem Sie Array von hexadezimalen Farbcode zu erstellen haben und und

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(); 

      } 
     }); 

    } 

} 

In benutzerdefinierten Adapter Code, um benutzerdefinierte Adapter-Klasse übergeben wird so sein, wo die Farbe Code analysiert werden

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; 
    } 
} 
Verwandte Themen