2017-07-21 3 views
0

Ich entwickle mit Xamarain Android auf C# gezielt auf KitKat (4.4 - API19).Android GridView Adapter verwendet falsche Position

Einstellung

So habe ich diese Liste der Fahrzeuge, die ich mit dem Gridview machen wollte. Da dies innerhalb eines Tabs liegt, befindet sich das GridView in einem Fragment, das beim ersten Klick auf den entsprechenden Tab (Code hier nicht gezeigt) erstellt wird. Das funktioniert gut, das Problem tritt auf, wenn der GarageFragmentAdapter Aufrufe bekommt. Ich habe sichergestellt, dass das Fragment und der Adapter nur einmal erstellt werden. Es ist also kein Problem, dass mehrere Instanzen mit ihren Werken kollidieren. Ich habe keine Glocken oder Pfeifen (Scroll-Reaktion oder Item-Reaktion) in dem Moment, in dem es nur um das Rendering.

Problem

In meinem Beispiel habe ich 4 Fahrzeuge, so lange 4 Artikel meiner Liste ist. Der erste Aufruf des Adapters verwendet die Position 0 (ok), der zweite Aufruf ebenfalls die Position 0 (NICHT ok) und dann gibt es nur einen dritten Aufruf, der Position 1 (definitiv nicht ok) und keinen vierten Aufruf verwendet. Die visuelle Ausgabe wird dann nur von zwei Elementen angezeigt, was auch nicht das ist, was ich erwarten würde, aber ich denke, dass GridView die Position verwendet, um ein Objekt an Position x zu rendern.

Also meine Frage wäre, wie kann ich den Adapter überzeugen, meine Datenliste korrekt zu durchlaufen?

-Code

Der Code ist als unten gesehen die neueste Iteration zuvor der Adapter innerhalb des Fragments gesetzt wurde, was ich dachte, war das Problem aufgrund irgendwo Lektüre dieses kann ein Problem sein.

public class GarageFragment : Fragment 
{ 
    private readonly VehiclesResponse _garageResponse; 
    private readonly GarageFragmentAdapter _adapter; 

    public GarageFragment(VehiclesResponse garageResponse, GarageFragmentAdapter adapter) 
    { 
     _garageResponse = garageResponse; 
     _adapter = adapter; 
    } 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     var fragmentView = inflater.Inflate(Resource.Layout.fragment_garage, container, false); 
     fragmentView.FindViewById<GridView>(Resource.Id.gridVehicleCards).Adapter = _adapter; 
     fragmentView.FindViewById<Button>(Resource.Id.btnShowFullGarage).Visibility = _garageResponse.TotalCarsInGarageCount > 4 ? ViewStates.Visible : ViewStates.Gone; 
     fragmentView.FindViewById<LinearLayout>(Resource.Id.boxAddVehicles).Visibility = _garageResponse.CanAddVehicles ? ViewStates.Visible : ViewStates.Gone; 

     return fragmentView; 
    } 
} 

public class GarageFragmentAdapter : BaseAdapter 
{ 
    private readonly Activity _context; 
    private readonly IList<Vehicle> _tileList; 

    public GarageFragmentAdapter(Activity context, IList<Vehicle> vehicles) 
    { 
     _context = context; 
     _tileList = vehicles; 
    } 

    public override int Count => _tileList.Count; 

    public override Object GetItem(int position) 
    { 
     return null; 
    } 

    public override long GetItemId(int position) 
    { 
     return position; 
    } 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     var view = convertView; 
     if (view == null) 
     { 
      var item = _tileList[position]; 
      view = _context.LayoutInflater.Inflate(Resource.Layout.BasicVehicleCard, null); 
      view.FindViewById<TextView>(Resource.Id.vehicleName).Text = item.Name; 
     } 

     return view; 
    } 
} 
+0

fügen 'Log.d' mit' position' Parameter in 'GetView' hinzu, was sehen Sie? – pskink

+0

@pskink D/Position (1492): 0, D/Position (1492): 0, D/Position (1492): 1 – TiGoRn

+0

heißt es vor 'var view = convertView;'? – pskink

Antwort

0

Es scheint Grid nicht funktioniert, wie ich erwarten würde. Es wächst nicht mit dem bereitgestellten Inhalt mit, es definiert, wie viel Inhalt es anzeigen/laden wird, abhängig vom verfügbaren Speicherplatz. (etwas, das in der Dokumentation des GridViews schön gewesen wäre)

Da dies für meine Anforderung nicht machbar ist, werde ich stattdessen GridLayout verwenden und die darin enthaltenen Inhaltselementansichten hinzufügen.

Verwandte Themen