2013-07-02 11 views
7

Desidero visualizzare gli elementi Arraylist in Gridview. Il mio Arraylist è come questo:Come visualizzare l'arraylist in gridview in android

1 Ciao Ciao

2 Ciao Ciao

Se mi legano a un controllo GridView come questo:

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

    gridview.setAdapter(adapter); 

EVENT_LIST è il mio Arraylist. Attraverso questo approccio ottengo una riga o un record Arraylist completo in una cella di gridview. Voglio visualizzare ogni elemento come "Hello" di Arraylist in ogni cella di gridview. Come 1 in una cella, "Ciao" in un'altra cella e così via.

Grazie in anticipo

+0

Perché non usare BaseAdapter? Ti darebbe pieno controllo nel piccolo costo di 3-4 funzioni aggiuntive. La tua stringa ArrayList completa la stringa "1 Hello Hello"? – sandrstar

+0

È così row = cn.getID() + "," + cn.getMessage() + "," + cn.getTime(); event_list.add (riga); –

+0

Non riesco a capire come funziona BaseAdapter? –

risposta

11

sembra È necessario utilizzare BaseAdapter, perché di default ArrayAdapter non è in grado di realizzare divisione di ArrayList elemento nel numero di elementi.

Quindi, sarebbe simile al seguente:

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

produrrà griglia con sei elementi. Vedi di più nel corrispondente Android Guide for Grid View.

+0

Perché dichiarare questa sottoclasse dell'adattatore come 'private final'? –

+1

@learnenburn non c'è motivo per cui qualcuno al di fuori possa aver bisogno di accedervi, in modo privato. Inoltre, questa classe non è progettata per l'ereditarietà, quindi definitiva. Di solito è una buona pratica, parzialmente basata su Java efficace (non ricordo gli elementi esatti del libro). – sandrstar

2

O forse usare questo:

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

    } 
} 

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

Creare un nuovo file xml nella cartella layout e chiamalo cell.xml e inserisci questo:

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

Ora eseguire e godere. Questo è uscita:

Hooray

+0

Forse non è esattamente ciò che desideri. ma è una risposta al titolo della tua domanda. –

+0

Funziona così. Ma mi chiedo perché. Dov'è l'array associato alla textview?Le viste testuali vengono automaticamente selezionate con le stringhe? – maggocnx

+0

è associato qui: [myGrid.setAdapter (nuovo ArrayAdapter (questo, R.layout.cell, valori));] –

Problemi correlati