Ich versuche, eine Anforderung zu erstellen, die jeweils 10 Elemente vom Server für jede Anforderung lädt. Wenn beispielsweise ein Benutzer auf eine Schaltfläche klickt und sie zur nächsten Seite weiterleitet, möchte ich, dass die ersten 10 Elemente zuerst angezeigt werden, während die Anforderungen für die anderen Elemente im Hintergrund ausgeführt werden. Wie soll ich das machen? Ich habe eine Idee, wie es funktionieren könnte, auf der Server-Seite, indem Sie die maximale Anzahl zurückgeben und von einer Startposition bei jeder Anfrage, aber ist das der richtige Weg, es zu betrachten?Laden von Daten in Schritten von zehn Elementen pro Ergebnis Xamarin-Formulare
1
A
Antwort
3
Ja, das klingt nach einem guten Weg, damit umzugehen. Dies wird oft als "Paginierung" von Daten bezeichnet.
Lassen Sie von Ihrer API einen Offset behandeln, für den die "Seite" der Daten, die Sie erhalten möchten, und die Anzahl der maximal für diese Seite zurückzugebenden Elemente (Seitengröße) zählt. Hier ist ein Beispiel, wie Sie dies für Formulare implementieren können.
Ein Vertrag für Ihr Ansichtsmodell umzusetzen:
public interface ISupportIncrementalLoading
{
int PageSize { get; set; }
bool HasMoreItems { get; set; }
bool IsLoading { get; }
Task LoadMoreItemsAsync();
}
eine Beispielimplementierung in einem Ansichtsmodell:
#region ISupportIncrementalLoading Implementation
public int PageSize { get; set; } = 10;
public bool HasMoreItems { get; set; }
public async Task LoadMoreItemsAsync()
{
await LoadMoreItemsCommand.ExecuteAsyncTask();
}
//...
#endregion
Beispiel LoadMoreItemsCommand:
LoadMoreItemsCommand = new Command(async() =>
{
int fetchOffset = Requests.Count;
int fetchMax = PageSize;
// "Pagination" of your API request starting at the offset
// and getting a maximum of the `fetchMax` or "page size"
Results = await GetRequestsAsync(fetchOffset, fetchMax);
});
Um dies automatisch in einem Steuerelement wie einem ListView
zu unterstützen, können Sie einen Renderer oder "Effekt" anpassen, um dies zu tun. Hier ist eine beschnittene Beispiel:
// Custom ListViewRenderer, iOS example
public class IncrementalListViewRenderer : ListViewRenderer
{
public IncrementalListViewRenderer()
{
}
protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
{
base.OnElementChanged(e);
if (Control != null)
{
// Need to customize the source but not lose existing functionality so
// we need a copy of it to use
UITableViewSource defaultSource = Control.Source;
Control.Source = new IncrementalDataSource(Element as IncrementalListView, defaultSource);
}
}
class IncrementalDataSource : UITableViewSource
{
readonly UITableViewSource existingSource;
readonly IncrementalListView listView;
readonly ISupportIncrementalLoading incrementalLoading;
int lastPosition;
int preloadMargin = 5;
public IncrementalDataSource(IncrementalListView listView, UITableViewSource existingSource)
{
this.listView = listView;
this.existingSource = existingSource;
incrementalLoading = listView.BindingContext as ISupportIncrementalLoading;
lastPosition = 0;
LoadMoreItems();
}
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
int position = indexPath.Row;
var itemsSource = listView.ItemsSource as IList;
if (itemsSource != null)
{
int preloadIndex = Math.Max(itemsSource.Count - preloadMargin, 0);
if ((position > lastPosition || (position == itemsSource.Count - 1)) && (position >= preloadIndex))
{
lastPosition = position;
if(!incrementalLoading.IsLoading && incrementalLoading.HasMoreItems)
LoadMoreItems();
}
}
var cell = existingSource.GetCell(tableView, indexPath);
cell.SelectionStyle = UITableViewCellSelectionStyle.None;
return cell;
}
public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
existingSource.RowSelected(tableView, indexPath);
}
public override nint RowsInSection(UITableView tableview, nint section)
{
return existingSource.RowsInSection(tableview, section);
}
void LoadMoreItems()
{
// Note the use of Nito.AsyncEx lib
INotifyTaskCompletion taskCompletion = NotifyTaskCompletion.Create(LoadMoreItemsAsync());
}
public async Task LoadMoreItemsAsync()
{
await incrementalLoading.LoadMoreItemsAsync();
}
}
}
Diese Techniken aus this Plugin nutzt.
Verwandte Themen
- 1. Kopieren von schritten Daten in C++
- 2. Speichern von Daten in Elementen
- 3. CSS 100% Breite mit Schritten pro 20px
- 4. Runden in Schritten von 2,5?
- 5. Kombinieren von Schritten
- 6. jQuery - beim Laden von dynamisch hinzugefügten Elementen
- 7. Laden von Daten in Eingabetextform
- 8. Laden von Daten effektiv in RecycleView
- 9. Probleme beim Laden von Aurelia-Elementen
- 10. Laden von UI-Elementen auf Benutzerbefehl
- 11. Matplotlib; Teilkräfte von zehn; Wissenschaftliche Notation
- 12. Laden von HTML-Elementen mit JS
- 13. Datentabelle: Laden von Daten in Blöcken
- 14. Übertragung von Daten zwischen den Schritten Frühling Batch
- 15. Laden von Daten-Arrays in Python
- 16. NodeJs Aufruf von Modulen in sequenziellen Schritten
- 17. Läden von Daten Laden von Daten in Hive/Impala
- 18. MSSQL Erstellen und Laden von Daten
- 19. AWS ElasticSearch Laden von Streaming-Daten
- 20. Verwenden von jQuery zum sequentiellen Laden und Einblenden von Elementen
- 21. Gibt es eine effizientere Möglichkeit, alle Kombinationen von 10 Elementen in 10% -Schritten zu finden?
- 22. Laden von Daten in DataGridView in C#
- 23. Importieren von Daten aus Visual Fox Pro
- 24. Parse Daten pro Datum von Mysql
- 25. Laden von Daten von einer anderen URL
- 26. Laden von PetaBytes von Daten im Maßstab
- 27. Erstellen von Spalten und Laden von Daten
- 28. Fehler beim Laden von Elementen in Alfresco YUI-Datentabelle
- 29. Auswählen von SQL XML-Elementen zwischen Daten
- 30. OOM laden Daten von Parkett