我在使用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;
}
答案 0 :(得分:1)
我认为您必须检查ISupportIncrementalLoading
界面。看看这个
这是一个示例http://www.codeproject.com/Articles/228873/Loading-Data-when-the-User-Scrolls-to-the-End-of
答案 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>
个委托传递到您的班级,这样如果有大量的增量列表,您可以避免实现几十个具体的类。