2017-02-21 1 views
1

In vielen Beispielen und Tutorials - wie GridView und Adapter zu verwenden ist der Fall, dass in unserem Adapter implementieren wir einige Liste von zum Beispiel Namen von Elementen in GridView.Android Adapter zu GridView - Liste der Schaltflächen statt Liste Namen der Schaltflächen

Wir überschreiben Methode getView in Adapter. Dann inflationieren wir unseren Artikel in gridView. wir ändern es nächsten Text aus der Liste in Text [Position]

ist hier Beispiel-Code:

public class TileAdapter erweitert BaseAdapter {

private Context context; 
private Tile[] tiles; 

public TileAdapter(Context context, Tile[] tiles){ 
    this.context = context; 
    this.tiles= tiles; 
} 

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

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View gridView; 

    if(convertView == null){ 

     gridView = new View(context); 
     gridView = inflater.inflate(R.layout.layout_tile, null); 

     TextView textView = (TextView) gridView.findViewById(R.id.tile_title); 
     textView.setText(tiles[position].getTitle()); 

    }else{ 
     gridView = (View) convertView; 
    } 

    return gridView; 

} 

alles funktioniert. Aber was, wenn ich Gegenstände aus einer Liste erstellen muss?

Nehmen wir an, wir haben irgendwo List<Button> buttons, wo wir unsere Tasten haben, die wir auch in anderen Klassen verwenden. GridView Adapter erhält von der "MainClass" diese Liste.

Wie wird getView() in Adapter codiert, um als Elemente unsere Tasten aus dieser Liste zu setzen? Also nicht neue Buttons zu erstellen, und sagen, dass die Bezeichnung der neuen Button ist die gleiche wie in der Liste, aber in GridView exatcly diese Tasten aus der Liste setzen!

Also brauche ich so etwas? Sie kennen die Idee?

Feld ist meine Klasse, die Taste

@Override 

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

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if(convertView == null){ 

      view= new View(context); 
      view= inflater.inflate(R.layout.field_layout, null); 

      //This is bad - but You know what i want? 
      Field field = (Field) view.findViewById(R.id.field); 
      field = fields.get(position); 

     }else{ 
      view= (View) convertView; 
     } 

     return view; 
    } 

Antwort

0

Nichts erstreckt zwingt Sie alle Elemente aufzublasen, wenn getView() genannt wird. Stattdessen können Sie die Liste der Ansichten beim Erstellen des Adapters erstellen und empfangen und sie zurückgeben.

So ein Beispiel dafür wäre:

public class TileAdapter extends BaseAdapter { 

    List<View> views = new ArrayList<>(); 

    public void setViews(@NonNull List<View> views) { 
     this.views = views; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return views.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return views.get(i); 
    } 

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

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     return views.get(i); 
    } 
} 
+0

Ich verstehe es nicht. Was ist das für Ansichten und wie man diese Knöpfe aus der Liste aufbläht? –

+0

Eine Ansicht kann wie in 'inflater.inflate (R.layout.field_layout, null) aufgebläht werden;' Sie können sie in Ihrer Aktivität aufblasen und an den Adapter oder den Adapterkonstruktor übergeben. Vielleicht sollten Sie dies lesen, bevor Sie fortfahren - http://www.vogella.com/tutorials/AndroidCustomViews/article.html –

+0

Ok, danke. Ich werde damit anfangen, das zu lesen –

Verwandte Themen