2013-07-02 2 views
7

Я хочу отображать элементы Arraylist в Gridview. Мои Список_массивы как это:Как отобразить arraylist в gridview в android

1 Hello Hello

2 Hello Hello

Если я привязать его к GridView контроля, как это:

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

    gridview.setAdapter(adapter); 

event_List мои Список_массивы. Благодаря этому подходу я получаю полную строку Arraylist или запись в ячейке gridview. Я хочу отображать каждый элемент как «Hello» из Arraylist в каждой ячейке gridview. Как 1 в одной ячейке, «Привет» в другой ячейке и так далее.

Заранее спасибо

+0

Почему бы не использовать BaseAdapter? Это даст вам полный контроль за небольшую стоимость 3-4 дополнительных функций. Является ли ваш элемент ArrayList полной строкой «1 Hello Hello»? – sandrstar

+0

Это так: row = cn.getID() + "," + cn.getMessage() + "," + cn.getTime(); event_list.add (строка); –

+0

Я не могу понять, как работает BaseAdapter? –

ответ

11

Кажется, вы должны использовать BaseAdapter, потому что по умолчанию ArrayAdapter не в состоянии выполнить деление ArrayList элемента в число элементов.

Таким образом, это будет выглядеть следующим образом:

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

будет производить сетку с шестью пунктами. См. Больше в соответствующем Android Guide for Grid View.

+0

Зачем объявлять этот подкласс адаптера как 'private final'? –

+1

@learnenburn нет причин, чтобы кто-либо извне мог получить к нему доступ, поэтому он был закрыт. Кроме того, этот класс не предназначен для наследования - настолько окончательный. Обычно это хорошая практика, частично основанная на эффективной Java (не помните точных статей из книги). – sandrstar

2

Или вы, возможно, использовать это:

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

    } 
} 

Ваш 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> 

Создать новый файл XML в папке макета и назовите его cell.xml и поместите это в него:

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

Теперь запустите и наслаждайтесь. Это вывод:

Hooray

+0

Возможно, это не то, что вы точно хотите. но это ответ на название вашего вопроса. –

+0

Он работает следующим образом. Но мне интересно, почему. Где массив связан с текстом?Являются ли Textviews автоматически выбраны vor Strings? – maggocnx

+0

привязан здесь: [myGrid.setAdapter (новый ArrayAdapter (это, R.layout.cell, значения));] –

Смежные вопросы