c# - 在 Collection View 中增量加载数据

标签 c# xamarin xamarin.forms xamarin.android

我正在尝试增量加载数据,但 RemainingItemsThresholdReachedCommand 不是由 RemainingItemsThreshold 触发的 这里是与此相关的文档:https://learn.microsoft.com/fr-fr/xamarin/xamarin-forms/user-interface/collectionview/populate-data :

这是我的收藏 View 页面:

<ContentPage.Content>
    <StackLayout BackgroundColor="#b4b4b4">
        <RefreshView Command="{Binding RefreshItemsCommand}" IsRefreshing="{Binding IsRefreshing}" >
            <CollectionView x:Name="CollectionViewThumbnails" SelectionMode="Multiple" Margin="13" ItemsSource="{Binding Items}" 
                              RemainingItemsThresholdReachedCommand="{Binding ItemTresholdReachedCommand}"
                              RemainingItemsThreshold="{Binding ItemTreshold}">
                <CollectionView.ItemsLayout>
                    <GridItemsLayout Orientation="Vertical" Span="1" VerticalItemSpacing="13" HorizontalItemSpacing="13"/>
                </CollectionView.ItemsLayout>
                <CollectionView.ItemTemplate>
                    <DataTemplate x:Name="data">
                        <Frame >
                            <StackLayout>
                                <Image Source="{Binding EmplacementThumbnails}" Aspect="AspectFill"/>
                            </StackLayout>
                        </Frame>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
        </RefreshView>
        <ActivityIndicator IsRunning="{Binding IsBusy}"
                       HeightRequest="30"
                       HorizontalOptions="Center"
                       VerticalOptions="Center"
                       WidthRequest="30"/>
        <StackLayout>
            <Button Text="Go" Clicked="StartProcessConcatePages"/>
        </StackLayout>
    </StackLayout>
</ContentPage.Content>

我的代码:

 public partial class ConcatePageThumbnails : ContentPage
{
    FileEndpoint fileEndpoint = new FileEndpoint();
    FileInfo fileInfo;
    BitmapDataStore viewModel;

    protected async override void OnAppearing()
    {
        base.OnAppearing();

        if (viewModel.Items.Count == 0)
            viewModel.LoadItemsCommand.Execute(null);

        MessagingCenter.Subscribe<object, ThumbnailsModel>(this, BitmapDataStore.ScrollToPreviousLastItem, (sender, item) =>
        {
            CollectionViewThumbnails.ScrollTo(item, ScrollToPosition.End);
        });
    }

//TODO -- Gerer le retour 
public ConcatePageThumbnails(FileInfo fileInfo)
    {
        InitializeComponent();

        this.fileInfo = fileInfo;
        BindingContext = viewModel = new BitmapDataStore(fileInfo);

    }

}

我的 View 模型:

public class BitmapDataStore
{
    IGetThumbnails getThumbnails;
    FileInfo fileInfo;
    public List<ThumbnailsModel> Items { get; set; }
    public Command LoadItemsCommand { get; set; }
    public Command ItemTresholdReachedCommand { get; set; }
    public Command RefreshItemsCommand { get; set; }
    public const string ScrollToPreviousLastItem = "Scroll_ToPrevious";
    private int _itemTreshold;
    private bool _isRefreshing;
    bool isBusy = false;
    public bool IsBusy
    {
        get { return isBusy; }
        set { isBusy = value; }
    }
    public bool IsRefreshing
    {
        get { return _isRefreshing; }
        set { _isRefreshing = value; }
    }

    public int ItemTreshold
    {
        get { return _itemTreshold; }
        set { _itemTreshold = value; }
    }

    public BitmapDataStore(FileInfo fileInfo)
    {
        ItemTreshold = 2;
        Items = new List<ThumbnailsModel>();
        this.fileInfo = fileInfo;
        getThumbnails = DependencyService.Get<IGetThumbnails>();

        LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand());
        ItemTresholdReachedCommand = new Command(async () => await ItemsTresholdReached());
        RefreshItemsCommand = new Command(async () =>
        {
            await ExecuteLoadItemsCommand();
            IsRefreshing = false;
        });
    }

    async Task ItemsTresholdReached()
    {
        if (IsBusy)
            return;

        IsBusy = true;

        try
        {
            var items = await getThumbnails.GetBitmaps(fileInfo.FullName, Items.Count);

            var previousLastItem = Items.Last();
            foreach (var item in items)
            {
                Items.Add(item);
            }
            Debug.WriteLine($"{items.Count()} {Items.Count} ");
            if (items.Count() == 0)
            {
                ItemTreshold = -1;
                return;
            }
            MessagingCenter.Send<object, ThumbnailsModel>(this, ScrollToPreviousLastItem, previousLastItem);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
        finally
        {
            IsBusy = false;
        }
    }

    async Task ExecuteLoadItemsCommand()
    {
        if (IsBusy)
            return;

        IsBusy = true;

        try
        {
            ItemTreshold = 2;
            Items.Clear();
            var items = await getThumbnails.GetBitmaps(fileInfo.FullName, Items.Count);
            foreach (var item in items)
            {
                Items.Add(item);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
        finally
        {
            IsBusy = false;
        }
    }
}

我的 Dependencyservice 类,我在其中获取缩略图和“集合” View 的项目:

 public async Task<List<ThumbnailsModel>> GetBitmaps(string filePath, int lastIndex = 0)
    {
        var sw = new Stopwatch();
        sw.Start();

        int numberOfItemsPerPage = 6;
        PdfRenderer pdfRenderer = new PdfRenderer(GetSeekableFileDescriptor(filePath));

        var appDirectory = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
        string fileName = System.IO.Path.GetFileNameWithoutExtension(filePath);
        string directoryPath = System.IO.Path.Combine(appDirectory, "thumbnailsTemp", System.IO.Path.GetFileNameWithoutExtension(fileName));
        List<ThumbnailsModel> thumbnailsModels = new List<ThumbnailsModel>();

        if (!Directory.Exists(directoryPath))
        {
            Directory.CreateDirectory(directoryPath);
        }
            //int pageCount = pdfRenderer.PageCount;

            for (int i = lastIndex; i < lastIndex + numberOfItemsPerPage; i++)
            {
                PdfRenderer.Page page = pdfRenderer.OpenPage(i);
                Android.Graphics.Bitmap bmp = Android.Graphics.Bitmap.CreateBitmap(page.Width, page.Height, Android.Graphics.Bitmap.Config.Argb4444);
                page.Render(bmp, null, null, PdfRenderMode.ForDisplay);

                try
                {
                    using (FileStream output = new FileStream(System.IO.Path.Combine(directoryPath, fileName + "Thumbnails" + i + ".png"), FileMode.Create))
                    {
                        bmp.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 0, output);
                    }

                    page.Close();
                }
                catch (Exception ex)
                {
                    //TODO -- GERER CETTE EXPEXPTION
                    throw new Exception();
                }
            }



        int y = 1;
        Directory.GetFiles(directoryPath).ToList<string>().Skip(lastIndex).Take(numberOfItemsPerPage).ForEach(delegate (string thumbnailsEmplacement)
        {
            thumbnailsModels.Add(new ThumbnailsModel(y, thumbnailsEmplacement));
            y++;
        });

        sw.Stop();





        return await Task.FromResult(thumbnailsModels);
    }

我尝试更改 ItemTreshold 值,但不起作用...有什么想法吗?

更新:

通过不同的测试,我看到 ItemTreshold 和 RemainingItemsThresholdReachedCommand 被触发,但未按预期触发。

我的 Collection View 正在加载项目集的数量,但是当我向下并触发 RemainingItemsThresholdReachedCommand 时,会连续触发此方法

例如,我有 30 个页面:前 6 个页面正在加载,但是当第一次触发 RemainingItemsThresholdReachedCommand 时,会一次又一次触发,直到所有页面和项目都完成。然后 ui Collection View 屏幕上什么也没有发生。

最佳答案

我刚刚从头开始使用这个示例,现在它可以工作了:https://forums.xamarin.com/discussion/comment/402926#Comment_402926

关于c# - 在 Collection View 中增量加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60709888/

相关文章:

c# - 如何记录我的 Web API 项目中依赖项解析期间抛出的异常?

c# - 如何以编程方式将 C# 中的图像源设置为 XAML 静态资源?

ios - Xamarin.iOS - 发布应用程序 - 无效的 Swift 支持

xamarin.forms - 从 View 函数创建 Xamarin.Forms.DataTemplate

c# - 简单的注入(inject)器术语澄清

c# - 这是找到给定月份每周的好算法吗?

android - 我的 Xamarin Android 应用程序突然收到 "Error: TrustFailure (The authentication or decryption has failed.)"

c# - 期待xamarin Box-view颜色动态变化

c# - 等待 PushModalAsync 表单以 xamarin 表单关闭

xamarin.forms - 在Google Play(Alpha)上上传Xamarin应用程序-未优化APK