2016-05-07 7 views
2

Ich habe Proben im Internet gelesen und einige sind sehr schwer zu lernen.Wie implementieren Sie eine Lazy Loading ListView auf einfache Weise für UWP?

Ich möchte lernen, zu verstehen, wenn die ListView nach unten scrollt und wenn mehr Daten noch verfügbar sind, wie ich die Daten aus dem Internet bekommen kann, während ein ProgressRing auf dem Bildschirm angezeigt wird.

Für mein Beispiel verwende ich JSON-Daten aus einem PHP-Server zu erhalten, und jede Anfrage I 10 Elemente aus der Datenbank zu erhalten.

Wenn Sie bitte ein leicht verständliches Beispiel liefern könnten, würde es sehr geschätzt werden.

+0

Sie implementieren können Schnittstelle ISupportIncrementalLoading, hier ist der Link https://michelsalib.com/2012/10/21/winrt-how - issupportincrementalloading-with-navigation/muss ordnungsgemäß implementiert werden. Wenn Sie mehr Hilfe benötigen, zögern Sie nicht zu fragen. – Archana

+0

@LovetoCode harten Code und funktioniert nicht sehr Fehler. Bitte lesen Sie meinen unteren Post und sagen, wie man Teil für Teilanforderung von URL-Server erhalten. Thanks –

+0

Server sollte Paginierung auch implementieren. – Archana

Antwort

0

können Sie verwenden

<ScrollViewer x:Name="scrollViewer" 
       Loaded="scrollViewer_Loaded" 
        ViewChanged="scrollViewer_ViewChanged"> 

     <StackPanel Orientation="Vertical"> 
      <ProgressRing IsActive="{x:Bind IsPullRefresh,Mode=OneWay}" Height="30"></ProgressRing> 
      <ListView x:Name="list" ItemsSource="{x:Bind Items}" ></ListView> 
     </StackPanel> 

    </ScrollViewer> 
</Grid> 



public sealed partial class MainPage : Page, INotifyPropertyChanged 
{ 
    public ObservableCollection<object> Items { get; set; } 

    public bool IsPullRefresh 
    { 
     get 
     { 
      return _isPullRefresh; 
     } 

     set 
     { 
      _isPullRefresh = value; 
      OnPropertyChanged(nameof(IsPullRefresh)); 
     } 
    } 

    bool _isPullRefresh = false; 

    public MainPage() 
    { 
     this.InitializeComponent(); 

     Items = new ObservableCollection<object>(); 
     for (int i = 0; i < 40; i++) 
     { 
      Items.Add(i); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string name) 
    { 
     this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 
    } 

    private void scrollViewer_Loaded(object sender, RoutedEventArgs e) 
    { 
     scrollViewer.ChangeView(null, 30, null); 
    } 

    private async void scrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e) 
    { 
     var sv = sender as ScrollViewer; 

     if (!e.IsIntermediate) 
     { 
      if (sv.VerticalOffset == 0.0) 
      { 
       IsPullRefresh = true; 
       await Task.Delay(2000); 
       for (int i = 0; i < 5; i++) 
       { 
        Items.Insert(0, i); 
       } 
       sv.ChangeView(null, 30, null); 
      } 
      IsPullRefresh = false; 
     } 
    } 
} 

Wenn Sie Chinesisch sehen, http://www.cnblogs.com/manupstairs/p/5184386.html

1

finde ich eine Möglichkeit, Daten mit ISupportIncrementalLoading Schnittstelle zu laden und mein Problem ist, wie man Listview kann sagen zu bekommen alle 10 Artikel pro Seite.

wie sagen kann nächsten Teil

dies ist mein Code in der Klasse zum Download bereit.

structList ist Klassenmodell für Objekte.

public sealed partial class MainPage : Page 
 
    { 
 
     public string category; 
 

 
     public MainPage() 
 
     { 
 
      this.InitializeComponent(); 
 
     } 
 
     protected async override void OnNavigatedTo(NavigationEventArgs e) 
 
     { 
 
      
 
      myListView.ItemsSource = new ItemsDataSource(); 
 
     } 
 

 

 
\t } 
 

 

 
    class ItemsDataSource : ObservableCollection<StructList>, ISupportIncrementalLoading 
 
    { 
 
     public int lastItem = 0; 
 
\t \t public string part =0; 
 
    
 

 
     public bool HasMoreItems 
 
     { 
 
      get 
 
      { 
 
       if (lastItem == 10000) 
 
       { 
 
        return false; 
 
       } 
 
       else 
 
       { 
 
        return true; 
 
       } 
 
      } 
 
     } 
 

 
     public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count) 
 
     { 
 

 

 
      CoreDispatcher coreDispatcher = Window.Current.Dispatcher; 
 

 
      return Task.Run<LoadMoreItemsResult>(async() => 
 
      { 
 
       await coreDispatcher.RunAsync(CoreDispatcherPriority.Normal, 
 
        () => 
 
        { 
 
        
 
        }); 
 

 
\t \t \t \t \t 
 
\t \t //get data by part 
 
\t \t //part in my server start with 0 and later 1,2,3... 
 
\t \t  List<StructList> items = new List<StructList>(); 
 
        List<KeyValuePair<string, string>> postData = new List<KeyValuePair<string, string>>(); 
 
        postData.Add(new KeyValuePair<string, string>("part", part)); 
 
        string JSonData = await WebService.get_post_respone(url, postData); 
 
        items = JsonConvert.DeserializeObject<List<StructList>>(JSonData); 
 
        
 
       
 
       await coreDispatcher.RunAsync(CoreDispatcherPriority.Normal, 
 
        () => 
 
        { 
 
         foreach (StructList item in items) 
 
         { 
 
          this.Add(item); 
 
         } 
 
        }); 
 

 
       return new LoadMoreItemsResult() { Count =count }; 
 
      }).AsAsyncOperation<LoadMoreItemsResult>(); 
 
     } 
 
    }

1
public sealed partial class MainPage : Page 
    { 
     public MainPage() 
     { 
      this.InitializeComponent(); 
      myListView.ItemsSource = new ItemsDataSource(); 
     } 
    } 
    public interface IIncrementalSource<T> 
    { 
     Task<IEnumerable<T>> GetPagedItems(int pageIndex, int pageSize,string url); 
    } 

    public class IncrementalLoadingCollection<T, I> : ObservableCollection<I>, 
     ISupportIncrementalLoading 
     where T : IIncrementalSource<I>, new() 
    { 
     private T source; 
     private int itemsPerPage; 
     private bool hasMoreItems; 
     private int currentPage=0; 
     string url; 
     public IncrementalLoadingCollection(string url,int itemsPerPage = 10) 
     { 
      this.source = new T(); 
      this.itemsPerPage = itemsPerPage; 
      this.hasMoreItems = true; 
      this.url = url; 
     } 

     public bool HasMoreItems 
     { 
      get { return hasMoreItems; } 
     } 

     public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count) 
     { 
      var dispatcher = Window.Current.Dispatcher; 

      return Task.Run<LoadMoreItemsResult>(
       async() => 
       { 
        uint resultCount = 0; 
        var result = await source.GetPagedItems(currentPage++, itemsPerPage,url); 

        if (result == null || result.Count() == 0) 
        { 
         hasMoreItems = false; 
        } 
        else 
        { 
         resultCount = (uint)result.Count(); 

         await dispatcher.RunAsync(
          CoreDispatcherPriority.Normal, 
          () => 
          { 
           foreach (I item in result) 
            this.Add(item); 
          }); 
        } 

        return new LoadMoreItemsResult() { Count = resultCount }; 

       }).AsAsyncOperation<LoadMoreItemsResult>(); 
     } 
    } 
    public class StructList 
    { 
     public string Name { get; set; } 
    } 
    public class ItemsDataSource : IIncrementalSource<StructList> 
    { 
     private List<StructList> persons; 

     public ItemsDataSource() 
     { 
      persons = new List<StructList>(); 

      //for (int i = 0; i < 1024; i++) 
      // { 
      // var p = new StructList { Name = "Person " + i }; 
      //  persons.Add(p); 
      // } 
     } 

     public async Task<IEnumerable<StructList>> GetPagedItems(int pageIndex, int pageSize,string url) 
     { 

      if (persons.Count > 10000) //you wriiten if (lastItem == 10000),assuming max items 10000 
       return null; 
      //If you want only 10 items and url returns more than 10 at a time  
      var result = (from p in persons 
          select p).Skip(pageIndex * pageSize).Take(pageSize); 
      if (result == null) 
      { 
       List<KeyValuePair<string, string>> postData = new List<KeyValuePair<string, string>>(); 
       postData.Add(new KeyValuePair<string, string>("part", pageIndex.ToString())); 
       string JSonData = await WebService.get_post_respone(url, postData); 
       var items = JsonConvert.DeserializeObject<List<StructList>>(JSonData); 
       foreach (var item in items) 
        persons.Add(item); 

       return await Task.Run<IEnumerable<StructList>>(() => 
       { 
        result = (from p in persons 
           select p).Skip(pageIndex * pageSize).Take(pageSize); 

        return result; 
       }); 
      } 
      else 
       return result; 
     } 
    } 

Weitere Informationen Refer this Link