首页 > 解决方案 > 增量加载集合不存在数据使用社区工具包

问题描述

我正在使用 uwp 社区工具包的增量加载集合。我更改了 PeopleSource 类,代码如下所示。

namespace Test
{
    public class TuchongSource : IIncrementalSource<TuchongImageMine>
    {
        private ObservableCollection<TuchongImageMine> _mine;
        public TuchongSource()
        {
            (Application.Current as App).bRefresh = true;
            _mine = new ObservableCollection<TuchongImageMine>();
            GetFirstData();
        }


        public async Task<IEnumerable<TuchongImageMine>> GetPagedItemsAsync(int pageIndex, int pageSize, CancellationToken cancellationToken = default(CancellationToken))
        {
            IEnumerable<TuchongImageMine> result = null;

            (Application.Current as App).currentPage++;
            ObservableCollection<TuchongImageMine> MineItems = new ObservableCollection<TuchongImageMine>();

            string url = "";
            if ((Application.Current as App).bRefresh)
                url = "https://api.tuchong.com/feed-app";
            else
                url = "https://api.tuchong.com/feed-app?post_id=" + (Application.Current as App).lastPostId + "&page=" + (Application.Current as App).currentPage.ToString() + "&type=loadmore";

            MineItems = await TuchongHelper.GetTuchongImage(url);
            foreach (var item in MineItems)
            {
                if ((Application.Current as App).toShowItems.Contains(item))
                    continue;
                (Application.Current as App).toShowItems.Add(item);
                _mine.Add(item);
                await Task.Delay(50);
            }
            (Application.Current as App).lastPostId = MineItems[MineItems.Count - 1].post_id;
            (Application.Current as App).bRefresh = false;

            result = (Application.Current as App).toShowItems.AsEnumerable<TuchongImageMine>();
            return result;
        }

        private async Task GetFirstData()
        {
            string url = "https://api.tuchong.com/feed-app";
            _mine = await TuchongHelper.GetTuchongImage(url);
            (Application.Current as App).lastPostId = _mine[_mine.Count - 1].post_id;
        }
    }
}

在 MainPage.xaml.cs 中,我使用

var ss = new IncrementalLoadingCollection<TuchongSource, TuchongImageMine>();
gridView.ItemsSource = ss;

但是我的 GridView 中没有显示任何内容。我想知道为什么。

如果你想看更多,这里是我的项目https://github.com/hupo376787/IncrementalLoadingCollection.git

标签: uwpwindows-community-toolkit

解决方案


该问题是由创建ObservableCollection<TuchongImageMine> _mine对象的异步方法引起的。在您从网站获取真实数据并分配给类中的对象之前,该_mine对象已使用MainPage.xaml.cs 中计数为 0 的对象创建。所以你的 GridView 什么都不显示。您可以将最合适的数据放在 MainPage.xaml.cs 中,但不能放在类的构造函数中。TuchongSourceIncrementalLoadingCollection<TuchongSource, TuchongImageMine>()ObservableCollection<TuchongImageMine> _mineTuchongSource

这是我在您的 MainPage.xaml.cs 中更改的代码;

public MainPage()
{
    this.InitializeComponent();
    ApplicationView.GetForCurrentView().SetPreferredMinSize(new Size(188, 188));

    //GetRecommend();
    //gridView.ItemsSource = (Application.Current as App).toShowItems;
}

protected async override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    var ss1 = new IncrementalLoadingCollection<TuchongSource, TuchongImageMine>();
    var res = await HttpHelper.GetJsonAsync<TuchongImageStandard>("https://api.tuchong.com/feed-app");

    foreach (var item in res.feedList)
            {
                TuchongImageMine mine = new TuchongImageMine();
                try
                {
                    mine.post_id = item.post_id;
                    mine.url = item.url;
                    mine.author_id = item.author_id;
                    mine.published_at = item.published_at;
                    mine.passed_time = item.passed_time;
                    mine.favorites = item.favorites;
                    mine.comments = item.comments;
                    mine.views = item.views;
                    mine.title = item.title;
                    mine.image_count = item.image_count;

                    if (item.image_count <= 0)
                        continue;
                    List<TuchongImageMine.Images> mineImages = new List<TuchongImageMine.Images>();
                    foreach (var item0 in item.images)
                    {
                        TuchongImageMine.Images ii = new TuchongImageMine.Images();
                        ii.img_realurl = "https://photo.tuchong.com/" + item0.user_id.ToString() + "/f/" + item0.img_id + ".jpg";
                        ii.img_id = item0.img_id;
                        ii.user_id = item0.user_id;
                        ii.title = item0.title;
                        ii.excerpt = item0.excerpt;
                        ii.width = item0.width;
                        ii.height = item0.height;
                        ii.description = item0.description;

                        mineImages.Add(ii);
                    }
                    mine.coverimg_realurl = mineImages[0].img_realurl;
                    mine.coverimg = await HttpHelper.GetWebImageAsync(mineImages[0].img_realurl);

                    mine.post_id = item.post_id;
                    mine.tags = item.tags;
                    mine.event_tags = item.event_tags;
                    mine.url = item.url;
                    mine.data_type = item.data_type;
                    mine.created_at = item.created_at;
                    mine.sites = item.sites;
                    TuchongImageMine.Site ss = new TuchongImageMine.Site
                    {
                        site_id = item.site.site_id,
                        type = item.site.type,
                        name = item.site.name,
                        domain = item.site.domain,
                        description = item.site.description,
                        followers = item.site.followers,
                        url = item.site.url,
                        icon = item.site.icon,
                        verified = item.site.verified,
                        verified_type = item.site.verified_type,
                        verified_reason = item.site.verified_reason,
                        verifications = item.site.verifications,
                        is_following = item.site.is_following,
                    };
                    mine.site = ss;
                    mine.recom_type = item.recom_type;
                    mine.rqt_id = item.rqt_id;
                    mine.is_favorite = item.is_favorite;

                    ss1.Add(mine);
                }
                catch (Exception ex)
                {

                }
            }

    //ss.Add()
    gridView.ItemsSource = ss1;
    //DataContext = ss1;
}

推荐阅读