2017-03-29 8 views
1

からリストビュー:Xamarinフォームは、私は、次のリストビューを有するXamarinの形でメモリエラー

<ListView x:Name="StudentView" RowHeight="55" SeparatorVisibility="None" CachingStrategy="RecycleElement"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="55"></RowDefinition> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*"></ColumnDefinition> 
         <ColumnDefinition Width="*"></ColumnDefinition> 
        </Grid.ColumnDefinitions> 

        <Image Source="{Binding Image}" Grid.Row="0" Grid.Column="0" Aspect="AspectFill"></Image> 
        <Image Source="{Binding Image}" Grid.Row="0" Grid.Column="1" Aspect="AspectFill"></Image> 
       </Grid> 
      </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

コードで私が1000個のアイテムの配列を宣言しているの背後。

問題は、リストビューを上下にスクロールすると、xamarinプロファイルでメモリ使用量が増え、CachingStrategy = "RecycleElement"が正しく動作しない(実際のアンドロイドデバイスでテストされた)ようです。

何度かスクロールした後、プログラムがメモリ不足でクラッシュします。

問題が何ですか?どうすれば解決できますか?

答えて

0

リストビューのItemSourceをどのように設定しているか、またはそれが何であるかわかりません。このためにコードビハインドファイルの一部を表示すると便利です。

ソースがインデックス可能でない場合、リサイクルに関するパフォーマンス上の問題が生じる可能性があります。 Xamarinの勧告はitemsourceにIListを使用することです。IEnumerableのようなものを使用すると大きな配列のパフォーマンスに問題が発生します。表示するアイテムを見つけるためにデータをループし続ける必要があるからです。

0

1000画像の項目が多いです!私はこれがAndroidであると確信しています。

1.-ページ戦略(負荷10、別の10をロードする)。 2.画像のサイズを小さくします。 3.キャッシュ可能な画像を次のように使用します。 https://github.com/luberda-molinet/FFImageLoading 4. RecyclerビューでViewカスタムレンダラーを実装します。

そして話題は、あなたのリストビューのパフォーマンスを向上させることができますどのようにどんどん大きくなるが、ここではいくつかの有用なリンクです: - https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/performance/

からhttps://blog.xamarin.com/creating-highly-performant-smooth-scrolling-android-listviews/

- https://blog.xamarin.com/tips-for-creating-a-smooth-and-fluid-android-ui/

- http://kent-boogaart.com/blog/jason-smith's-xamarin-forms-performance-tips

0

私は同じ問題がありました大きな解像度の画像や画像のリストがこの問題の原因になります。FFImageLoadingが見つかったので、nugetで利用可能なhereを見つけました。可能であれば、実際の画像の代わりにサムネイルをバインドしてみてください。

<ContentPage xmlns:ci="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms"> 
<ci:CachedImage Source="{Binding ActualImageThumbnail}" Aspect="Fill"/> 
+0

画像が異なる場合も同じですか?例えば、私は1000のイメージを持っていて、FFImageLoadingライブラリがすべてのイメージをキャッシュしているとします。私は、上下にスクロールしたり、逆にメモリを増やしたり、リストビューでリサイクルポリシーを使用したりしないという問題があります。 – Tom

+0

はい、うまくいくでしょう。 )、それが上下にスクロールされたときに 'outOfMemory'例外が発生しました。 1000以上のアイテムをリストビューに読み込むことは特に勧められません。モバイルデバイスでは、アプリのパフォーマンスが低下するため、ページングの面倒を見てサムネイルを使用してメモリ消費を減らします –

関連する問題