2016-10-30 11 views
0

Ich habe eine Liste von Wörtern. Ich möchte, dass die Buchstaben jedes Worts in der Liste als Bilder in einer GridView angezeigt werden.Wie man GridView zu ListView hinzufügt

Ich habe eine funktionierende Version von diesem implementiert, indem ich einen benutzerdefinierten Adapter, WordListAdapter, für meine Liste der Wörter erstelle. Für jedes Wort ruft WordListAdapter.getView wiederum einen benutzerdefinierten Adapter, LetterImageAdapter, auf, um die Buchstaben in den Wörtern anzuzeigen. Da ich neu in der Android-Programmierung bin, frage ich mich, ob das ein guter Ansatz ist. Es scheint eine Menge Arbeit zu sein. Wenn es ein guter Ansatz ist, wird dies vielleicht für jemand anderen hilfreich sein.

Ich habe eine Reihe von anderen Posts über GridVeiws in ListViews gesehen. Viele von ihnen berührten Probleme mit dem Scrollen und dem Speicher, aber ich sah für diesen Anwendungsfall nichts Spezielles.

In meiner Tätigkeit:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_game); 
    ListView listView = (ListView) findViewById(R.id.wordList); 
    listView.setAdapter(new WordListAdapter(this, new String[]{"ABC", "DEF"})); 
} 

WordListAdapter.getView()

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.word_grid, null); 
     GridView gridView = (GridView) convertView.findViewById(R.id.word_grid_id); 
     holder = new ViewHolder(); 
     holder.gridView = gridView; 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.gridView.setAdapter(new LetterImageAdapter(mContext, words[position])); 
    return convertView; 
} 

private static class ViewHolder { 
    GridView gridView; 
} 

LetterImageAdapter.getView()

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.letter_item, null); 
     holder = new ViewHolder(); 
     holder.icon = (ImageView) convertView.findViewById(R.id.list_item_letter_imageview); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    // resource for each letter is in lettersId array 
    holder.icon.setImageResource(letterIds[position]); 
    return convertView; 
} 

private static class ViewHolder { 
    ImageView icon; 
} 

// transform word into array of resources for each letter 
private void buildResourceArray(String packageName) { 
    letterIds = new int[theWord.length()]; 
    for (int index = 0; index < theWord.length(); index++) { 
     letterIds[index] = getResourceId(theWord.substring(index, index + 1).toLowerCase(), "drawable", packageName); 
    } 
} 

Antwort

1

Ich würde vorschlagen, ein LinearLayout mit ImageView s zu verwenden, anstelle von GridView, um die Buchstaben zu halten.

Während technisch ist es möglich, eine GridView innerhalb einer ListView, GridView s sind ziemlich komplexe Objekte, besser geeignet, um eine Hauptliste als ein recycelbares Kind Element sein. Sie werden beim Recycling der Hauptelemente auf komplexe Probleme stoßen, da jedes GridView über einen eigenen Adapter verfügt.

So wie die Anzahl der Buchstaben ist ziemlich begrenzt, ein LinearLayout (vielleicht in einem HorizontalScrollView) ist ein weit einfacherer Ansatz. Sie können sogar die Buchstaben Bitmaps zwischenspeichern oder sie als Ressourcen umfassen, so dass sie von allen ImageViews im LinearLayout s gemeinsamen

auf Ihre Absichten im Zusammenhang etwas zu tun, Sie zu RecyclerView besser aussehen würden, ist diese Art von einer Container für abstrakte Objekte, den Sie einrichten können, um alle Arten von komplexen Layouts auszuführen. Aber als Anfänger würde ich vorschlagen, zuerst die einfachere ListView/GridView zu meistern und dann in RecyclerView zu gehen, wenn Sie verstehen, wie das View-Recycling funktioniert.

+0

Danke! Es klingt also so, als würde ich eine ListView innerhalb des LinearLayouts benötigen, damit ich über die Bilder iterieren kann. Übrigens, ich habe überprüft, ob ich deine Antwort akzeptiere, sehe aber keine Abstimmung. – user6627139

+0

Eigentlich meinte ich LinearLayouts mit Bildern als ListView Items. Mein Hauptpunkt ist, geschachtelte Listenwidgets zu vermeiden – rupps