0

ビューページャーを主要なナビゲーション要素として使用して、雑誌の電子リーダー アプリを構築しています。記事オブジェクトは (REST Web サービスから受信したデータから) デシリアライズされ、ページャー アダプターによって膨張される「カバー ページ」を膨張させるために使用され、ユーザーはそれを「めくります」。

これはすべて、PagerAdapter を次のような instantiateItem メソッド (アダプターのコンストラクターに渡された記事の ArrayList を使用) と使用して完全に機能します。

    @Override
    public Object instantiateItem(View arg0, int position) {

    final Article s = toShow.get(position);

    View v = getLayoutInflater().inflate(R.layout.previewpage, null);

    TextView hl = (TextView)v.findViewById(R.id.coverHl);
    ImageView img = (ImageView)v.findViewById(R.id.coverImg);

            ....

    hl.setText(s.title);
    img.setImageBitmap(s.image);

私の問題は、6 番目の位置ごとに、別のビューを膨らませて広告を表示したいということです。現時点では、次のようにこのメソッドの先頭に if ステートメントを追加しています。

if ((position != 0) && (position%6 == 0)){

その後、もう一方のビューを膨らませて、適切な広告を配置します。ただし、これは多くの複雑さをもたらします。次のビューでは、toShow.get(position) と言うことができなくなりました。配列内の記事の 1 つ (広告が表示された位置にある記事) をスキップするからです。そこで、int adsShown広告が表示されるたびにインクリメントされる を作成し、 を呼び出しますfinal Article s = toShow.get(position - adsShown)。しかし、私がそうすると、ユーザーがビューページャーをめくると、position-adsshown が -1 であるため、ArrayIndexOutOfBounds エラーが表示されます。

これらの問題の回避策を見つけられることはわかっていますが、そもそもこのタスクを処理するためのより簡単な方法があるかどうか疑問に思っています.

何か案は?

4

1 に答える 1

1

次のようなものを使用して正しい位置を取得できます。

// check if position > 0 to make sure we don't start with an ad
if(position > 0 && position%6 == 0) {
  // get ad view here
else {
  int index = position - (int)Math.floor(position/6);
  final Article s = toShow.get(index);
  ...
}

またgetCount、記事の数に広告の数を加えた数を返す必要があることに注意してください。そうしないと、配列にあるすべての記事が表示されません。

于 2013-03-08T04:53:13.630 に答える