private void Search(string text) { if (!string.Equals(text, Text, StringComparison.OrdinalIgnoreCase)) { return; } if (_lastRequest != null) { _lastRequest.Cancel(); } var trimmedText = Text.Trim(); if (string.IsNullOrEmpty(trimmedText)) { Execute.BeginOnUIThread(() => { if (!string.Equals(trimmedText, Text.Trim(), StringComparison.OrdinalIgnoreCase)) { return; } Rows.Clear(); var firstSliceCount = 5; var count = 0; var secondSlice = new List <DialogRow>(); foreach (var item in _previousRows) { if (count < firstSliceCount) { Rows.Add(item); count++; } else { secondSlice.Add(item); } } if (secondSlice.Count > 0) { Execute.BeginOnUIThread(() => { if (!string.Equals(trimmedText, Text.Trim(), StringComparison.OrdinalIgnoreCase)) { return; } foreach (var item in secondSlice) { Rows.Add(item); } }); } }); return; } var nextRequest = GetNextRequest(text, DialogsSource); nextRequest.ProcessAsync(results => { if (nextRequest.IsCanceled) { return; } if (!string.Equals(Text, nextRequest.Text, StringComparison.OrdinalIgnoreCase)) { return; } Rows.Clear(); if (results.Count > 0) { DialogRow currentRow = null; var secondSlice = new List <DialogItem>(); var maxCount = 16; for (var i = 0; i < results.Count; i++) { var d = results[i]; if (i < maxCount) { if (i % 4 == 0) { currentRow = new DialogRow(); Rows.Add(currentRow); } currentRow.Add(d); d.Row = currentRow; } else { secondSlice.Add(d); } } if (secondSlice.Count > 0) { Execute.BeginOnUIThread(() => { if (nextRequest.IsCanceled) { return; } if (!string.Equals(Text, nextRequest.Text, StringComparison.OrdinalIgnoreCase)) { return; } for (var i = 0; i < secondSlice.Count; i++) { if (i % 4 == 0) { currentRow = new DialogRow(); Rows.Add(currentRow); } currentRow.Add(secondSlice[i]); secondSlice[i].Row = currentRow; } }); } } }); _searchResultsCache[nextRequest.Text] = nextRequest; _lastRequest = nextRequest; }