如何在Windows Phone 8.1中实现列表视图加载更多...?

时间:2015-03-27 10:15:14

标签: c# xaml windows-phone-8.1

我在使用json webservice获取对listview偏移量的响应绑定后。启动只有20个记录绑定后滚动列表视图再次通过基于偏移量的最后一个id传递给服务的记录绑定?如何实现此功能... ? 这是我的代码:

<ListView x:Name="GetallquestionListview" ItemsSource="{Binding}"  Background="White" BorderThickness="0" Margin="0" Height="Auto"  VerticalAlignment="Stretch" ItemContainerStyle="{StaticResource Latestitemcontainerstyle}"
                                ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Disabled"  Padding="0" VerticalContentAlignment="Stretch" SelectionChanged="GetallquestionListview_SelectionChanged"  >
                        <ListView.Header>
                            <ProgressBar x:Name="myIndeterminateProbar" IsIndeterminate="True" Height="50" Visibility="Collapsed"></ProgressBar>
                        </ListView.Header>

                            <ListView.ItemTemplate>

                                <DataTemplate>
                                <Border BorderThickness="0,0,0,1" HorizontalAlignment="Stretch" RequestedTheme="Light" BorderBrush="#aaBFBCBC" >
                                        <StackPanel Orientation="Vertical" Width="Auto" >
                                        <TextBlock Margin="0" x:Name="Name" Text="{Binding question_text}" TextWrapping="Wrap" Foreground="#FF110202" FontSize="18" FontFamily="Segoe UI Semibold" Padding="8,15,8,3" SelectionHighlightColor="White" ></TextBlock>


                                        <Image Margin="8" x:Name="image1" Source="{Binding thumbnail_path}" MaxHeight="200" Stretch="UniformToFill"></Image>

                                        <TextBlock Margin="0" x:Name="FristName" Text="{Binding total_votes}" TextWrapping="Wrap" Foreground="#FF03A9F5" FontSize="16" FontFamily="Segoe WP Semibold" Padding="8,3,8,10" FontWeight="Bold" ></TextBlock>



                                    </StackPanel>
                                    </Border>
                                </DataTemplate>

                            </ListView.ItemTemplate>


                        </ListView>

这是我的代码:

  private async void Getallquestion()
        {
            try
            {
                myIndeterminateProbar.Visibility = Visibility.Visible;
                if (App.IsInternetAvailable)
                {
                    string Longitude = await Locations.GetLongitude();
                    string Lattitude = await Locations.GetLattitude();
                    var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
                    string Sortigntype;

                    // Create a simple setting
                    Object value = localSettings.Values["Login_Data"];
                    string UserId = value.ToString();
                    //Calling Webservice
                    string QuestionsList = await WebServices.GetAllQuestionByoffset(Convert.ToInt32(UserId), 20, Lastoffsetindex, LastquestionId, Convert.ToDouble(Lattitude), Convert.ToDouble(Longitude), lastsyncime, 1);

                    if (QuestionsList != null)
                    {
                        DataContractJsonSerializer obj1 = new DataContractJsonSerializer(typeof(UserMessage));
                        UserMessage Questionstatusobject = obj1.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(QuestionsList))) as UserMessage;

                        string StatusId = Questionstatusobject.status_id.ToString();
                        string Message = Questionstatusobject.message;
                        if (StatusId == "1")
                        {

                            JObject retun_json = JObject.Parse(QuestionsList);

                            JToken token = JToken.Parse(QuestionsList);
                            JArray questionss = (JArray)token.SelectToken("questions");

                            string votetext;
                            for (int i = 0; i < questionss.Count; ++i)
                            {
                                Questions ques = new Questions();
                                //  string questiontext;
                                //if (questionss[i]["question_text"].ToString() == "")
                                //{
                                //    ques.question_text = questionss[i]["question_text"].ToString();
                                //}
                                //else
                                //{
                                //   questiontext = Locations.EncodeDecodeBase64(questionss[i]["question_text"].ToString());

                                //}
                                //  ques.question_text = Locations.EncodeDecodeBase64(ques.question_text);
                                ques.question_text = Locations.DecodeFrom64(questionss[i]["question_text"].ToString());
                                // ques.question_text = questionss[i]["question_text"].ToString();
                                ques.thumbnail_path = questionss[i]["thumbnail_path"].ToString();
                                ques.question_id = Convert.ToInt32(questionss[i]["question_id"]);
                                ques.user_id = Convert.ToInt32(questionss[i]["user_id"]);
                                if (questionss[i]["total_votes"].ToString() == "1")
                                {
                                    votetext = "Vote";
                                }
                                else
                                {
                                    votetext = "Votes";
                                }
                                ques.total_votes = questionss[i]["total_votes"] + " " + votetext;
                                GetallquestionListview.Items.Add(ques);
                                GetAllquestionsdata.Add(ques);

                            }





                        }
                        else
                        {
                            MessageDialog msgbox2 = new MessageDialog("" + Message + "");
                            await msgbox2.ShowAsync();
                        }
                    }
                    else
                    {
                        MessageDialog msgbox = new MessageDialog("Oops! something went wrong. Please try again.");
                        await msgbox.ShowAsync();
                    }
                }
                else
                {
                    MessageDialog msgbox = new MessageDialog("Please check your Internet connection.");
                    await msgbox.ShowAsync();
                }
                 }
                catch(Exception ex)
                {

                }
            myIndeterminateProbar.Visibility = Visibility.Collapsed;
        }

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

您需要在集合中实现ISupportIncrementalLoading接口。

MSDN提供example implementation.

public class BaseIncrementalObservableCollection<T> : ObservableCollection<T>
    #region ISupportIncrementalLoading

    public bool HasMoreItems
    {
        get { return HasMoreItemsOverride(); }
    }

    public Windows.Foundation.IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
    {
        if (_busy)
        {
            throw new InvalidOperationException("Only one operation in flight at a time");
        }

        _busy = true;

        return AsyncInfo.Run((c) => LoadMoreItemsAsync(c, count));
    }

    #endregion 

    #region INotifyCollectionChanged

    public event NotifyCollectionChangedEventHandler CollectionChanged;

    #endregion 

    #region Private methods

    async Task<LoadMoreItemsResult> LoadMoreItemsAsync(CancellationToken c, uint count)
    {
        try
        {
            var items = await LoadMoreItemsOverrideAsync(c, count);
            var baseIndex = _storage.Count;

            _storage.AddRange(items);

            // Now notify of the new items
            NotifyOfInsertedItems(baseIndex, items.Count);

            return new LoadMoreItemsResult { Count = (uint)items.Count };
        }
        finally
        {
            _busy = false;
        }
    }

    void NotifyOfInsertedItems(int baseIndex, int count)
    {
        if (CollectionChanged == null)
        {
            return;
        }

        for (int i = 0; i < count; i++)
        {
            var args = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, _storage[i + baseIndex], i + baseIndex);
            CollectionChanged(this, args);
        }
    }

    #endregion

    #region Overridable methods

    protected abstract Task<IList<T>> LoadMoreItemsOverrideAsync(CancellationToken c, uint count);
    protected abstract bool HasMoreItemsOverride();

    #endregion 

    #region State

    List<T> _storage = new List<T>();
    bool _busy = false;

    #endregion
}

然后你可以从中得出并实现具体的请求。

public class UserIncrementalObservableCollection : BaseIncrementalObservableCollection<User>
{
    protected override Task<IList<User>> LoadMoreItemsOverrideAsync(CancellationToken c, uint count) 
    {
        // your call to the webservice
    }
    protected override bool HasMoreItemsOverride() 
    {
        // check if there are more
    }

}

或者,将Func<CancellationToken, uint, IList<T>>Func<bool>个委托传递到您的班级,这样如果有大量的增量列表,您可以避免实现几十个具体的类。