ViewPagerコンポーネントを使用して無限カルーセルを実装しようとしています。Antonytによって作成されたものに基づいていますが、4つ未満のビューを使用すると問題が発生します。ビューはすでに配置されているため。Viewpagerをだまして、同じビュー/ページを別の場所に描画する方法である必要があります。
4 に答える
私は同じ問題に遭遇しました、自分で解決策を見つけることができませんでした。しかし、1〜4ビューだけでは不可能だと思います。問題は、すべてのビュー(繰り返しの1〜4画像)が一度に(または少なくとも非常に短い間隔で)インスタンス化されることです。これは、前のロードが終了していないため、画像のロードプロセスに干渉します。 1つは破損したビューを返します。しかし、あなたはこれをこのように扱うかもしれません。
1)インスタンス化の直後に、100〜200ミリ秒の遅延でハンドラーを使用して、ビューsetCurrentItem()をいずれかの方向に何度も(約10回)めくります。これにより、元の4が範囲外になります(画面外のページがある場合)制限。コードの性質が無限であるため、制限があります)。後で1つずつ作成されます。
2)複数のバッファオブジェクトを使用します。
1画像-8バッファ
2つの画像-それぞれに4つのバッファ
3つの画像-それぞれに2つのバッファ...このようなもの。
どちらも理想的な解決策ではありませんが、どちらも私にとってはうまくいきました。あなたも何を試したのか知りたいです。
解決策は、ViewPagerで同じ子ビューを使用することです。また、同じ子を親に割り当てずにこれを行うには、実際のビューを内部に持つProxyViewを使用します。そのフェイクビューをViewGroupから拡張し、Drawメソッドをオーバーライドするとうまくいきます!
切り離されたアイテムを再アタッチするには、OnDestoryItemメソッドでいくつかの作業を行う必要がある場合があります。
私はすでに私の解決策をここに投稿しています、https://github.com/antonyt/InfiniteViewPager/issues/2
(偽の)無限を作るために私がうまく使った次のトリックを試してくださいListView
。
アダプタのgetCount()
メソッドで、Integer.MAX_VALUEを返します。
次に、アダプタinstantiateItem()
またはdestroyItem()
で、を使用しますposition % datasource.size()
このトリックはここから取られました。