2013-07-02 9 views
7

Ich möchte Arraylist Elemente in Gridview anzeigen. Mein Arraylist ist wie folgt:Wie arraylist in gridview in android anzuzeigen

1 Hallo Hallo

2 Hallo Hallo

Wenn ich es zu einem Gridview-Steuerelement wie folgt binden:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, event_list); 

    gridview.setAdapter(adapter); 

EVENT_LIST meine Arraylist ist. Durch diesen Ansatz erhalte ich eine vollständige Arraylist-Zeile oder einen Record in einer Zelle von Gridview. Ich möchte jedes Element wie "Hallo" von Arraylist in jeder Zelle von Gridview anzeigen. Wie 1 in einer Zelle, "Hallo" in einer anderen Zelle und so weiter.

Vielen Dank im Voraus

+0

Warum nicht BaseAdapter verwenden? Es würde Ihnen volle Kontrolle in kleinen Kosten von 3-4 zusätzlichen Funktionen geben. Ist Ihr ArrayList-Eintrag die Zeichenfolge "1 Hello Hello"? – sandrstar

+0

Es ist wie folgt row = cn.getID() + "," + cn.getMessage() + "," + cn.getTime(); event_list.add (Zeile); –

+0

Ich kann nicht herausfinden, wie BaseAdapter funktioniert? –

Antwort

11

Scheinen müssen Sie BaseAdapter verwenden, da Standard-ArrayAdapter nicht in der Lage ist Teilung von ArrayList Elemente in Anzahl der Elemente zu erreichen.

So würde es wie folgt aussehen:

public class MyActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final GridView grid = (GridView) findViewById(R.id.gridView); 
     final ArrayList<String> items = new ArrayList<String>(); 

     items.add("1 , Hello11 , Hello12"); 
     items.add("2 , Hello21 , Hello22"); 

     grid.setAdapter(new GridAdapter(items)); 
    } 

    // Assume it's known 
    private static final int ROW_ITEMS = 3; 

    private static final class GridAdapter extends BaseAdapter { 

     final ArrayList<String> mItems; 
     final int mCount; 

     /** 
     * Default constructor 
     * @param items to fill data to 
     */ 
     private GridAdapter(final ArrayList<String> items) { 

      mCount = items.size() * ROW_ITEMS; 
      mItems = new ArrayList<String>(mCount); 

      // for small size of items it's ok to do it here, sync way 
      for (String item : items) { 
       // get separate string parts, divided by , 
       final String[] parts = item.split(","); 

       // remove spaces from parts 
       for (String part : parts) { 
        part.replace(" ", ""); 
        mItems.add(part); 
       } 
      } 
     } 

     @Override 
     public int getCount() { 
      return mCount; 
     } 

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

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

     @Override 
     public View getView(final int position, final View convertView, final ViewGroup parent) { 

      View view = convertView; 

      if (view == null) { 
       view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false); 
      } 

      final TextView text = (TextView) view.findViewById(android.R.id.text1); 

      text.setText(mItems.get(position)); 

      return view; 
     } 
    } 
} 

Wird Gitter mit sechs Einzelteile produzieren. Sehen Sie mehr im entsprechenden Android Guide for Grid View.

+0

Warum diese Adapterunterklasse als 'private final 'deklarieren? –

+1

@Learnenburn gibt es keinen Grund, dass irgendjemand draußen Zugang zu ihm haben muss, also privat. Außerdem ist diese Klasse nicht für Vererbung ausgelegt - also endgültig. Normalerweise ist es eine gute Übung, die teilweise auf Effektivem Java basiert (erinnere dich nicht an genaue Gegenstände aus dem Buch). – sandrstar

2

Oder Sie vielleicht verwenden:

MainActivity.java:

import android.os.Bundle; 
import android.app.Activity; 
import android.support.annotation.NonNull; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.GridView; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.Iterator; 
import java.util.List; 
import java.util.ListIterator; 

public class MainActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    List<String> values=new ArrayList<String>(); 
    values.add("Home");values.add("About");values.add("Contact");values.add("Help");values.add("Index"); 
    values.add("Home");values.add("About");values.add("Contact");values.add("Help");values.add("Index"); 
    GridView myGrid=(GridView)findViewById(R.id.grid); 

    myGrid.setAdapter(new ArrayAdapter<String>(this,R.layout.cell,values)); 

    } 
} 

Ihre activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
> 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/mySelection" /> 
<GridView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/grid" 
    android:columnWidth="75dip" 
    android:gravity="center" 
    android:horizontalSpacing="5dip" 
    android:numColumns="auto_fit" 
    android:stretchMode="columnWidth" 
    android:verticalSpacing="75dip"> 

</GridView> 

Erstellen Sie eine neue XML-Datei in das Layout-Ordner und Nennen Sie es cell.xml und fügen Sie es ein:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp"> 

Jetzt laufen und genießen. Dies ist Ausgabe:

Hooray

+0

Es ist vielleicht nicht das, was Sie genau wollen. aber es ist eine Antwort auf den Titel Ihrer Frage. –

+0

Es funktioniert so. Aber ich frage mich warum. Wo ist das Array an die Textansicht gebunden?Werden Textviews automatisch vor Strings ausgewählt? – maggocnx

+0

ist hier gebunden: [myGrid.setAdapter (neuer ArrayAdapter (dies, R.layout.cell, Werte));] –

Verwandte Themen