2013-07-02 10 views
7

ArraylistアイテムをGridviewに表示したい。私はこのようなGridViewコントロールにバインドした場合androidのgridviewにarraylistを表示する方法

1こんにちはこんにちは

2こんにちはこんにちは

:私のArrayListのは、このようなものです

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

    gridview.setAdapter(adapter); 

EVENT_LISTは私のArrayListです。この方法で、私は完全なArraylist行またはレコードをgridviewのセルに入れます。私はgridviewの各セルにArraylistの "Hello"のような各項目を表示したい。 1つのセルに1、他のセルに「こんにちは」など。事前

+0

?それはあなたに3〜4の追加機能の小さなコストで完全なコントロールを与えるでしょう。あなたのArrayListアイテムは完全な文字列 "1 Hello Hello"ですか? – sandrstar

+0

これは次のようなものです row = cn.getID()+ "、" + cn.getMessage()+ "、" + cn.getTime(); event_list.add(row); –

+0

BaseAdapterの仕組みはわかりません。 –

答えて

11

おかげで、デフォルトArrayAdapterは、要素の数にArrayList要素の分割を達成することができませんので、あなたは、BaseAdapterを使用する必要があるようです。

だから、それは次のようになります。

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

は6つの項目でグリッドを演出します。対応するAndroid Guide for Grid Viewを参照してください。

+0

なぜこのアダプタのサブクラスを 'プライベートファイナル'と宣言していますか? –

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

今すぐ実行して、お楽しみください。これが出力されます。

BaseAdapterを使用しないのはなぜ

Hooray

+0

あなたが望むものではないかもしれません。あなたの質問のタイトルに対する答えです。 –

+0

これはこのように機能しています。しかし、なぜ私は不思議です。配列はどこにテキストビューにバインドされていますか?Textviewsは自動的に文字列の選択ですか? – maggocnx

+0

ここにバインドされています:[myGrid.setAdapter(new ArrayAdapter (this、R.layout.cell、values));] –

関連する問題