3

です)ネットワークから、私はそのコードをした:無効化が要求されるギャラリーに奇妙なアニメーション、それはこれは私が私が非同期(一部の回これは来ることができ、画像をロードしたいImageViews(ページの親指)</p> <p>を表示した上で、私のギャラリーのアダプタである子供

public View getView(int position, View convertView, ViewGroup parent) { 
     final ImageView image = convertView != null ? convertView : new ImageView(getContext()); 

     final PageInfo page = getItem(position); 

     image.setBackgroundColor(Color.WHITE); 

     image.setLayoutParams(new Gallery.LayoutParams(96, 170)); 

     new AsyncTask<Void, Void, Bitmap>() { 
      @Override 
      protected Bitmap doInBackground(Void... arg0) { 
       try { 
        File thumbnail = page.thumbnail();//Thumbnail download the image if not available 
        return BitmapFactory.decodeStream(new FileInputStream(thumbnail)); 
       } catch (ApplicationException e) { 
        return null; 
       } catch (NetworkException e) { 
        return null; 
       } 
      } 

      protected void onPostExecute(Bitmap result) { 
       if (result == null) 
        return; 

       image.setImageBitmap(result); 
      }; 
     }.executeOnExecutor(executor); 

     return image; 
    } 

これは動作しますが、私はギャラリービューを(実際のビットマップへの切り替え時)にドラッグしていた場合、ギャレー内の別の位置に「ジャンプ」を行います、それは変だ。

どうすれば避けることができますか?または、ViewGroupのレイアウトを要求せずにImageViewのイメージを変更できますか?

EDIT:Googleのdevのグループで同様の質問 http://code.google.com/p/android/issues/detail?id=15526

答えて

4

ギャラリーウィジェットは、それが常にnull convertViewを返すようになり、既知のバグがあります。これは、getViewが呼び出されるたびに、あなたが見ている問題を引き起こしているかもしれない新しいImageViewを作成していることを意味します。

リサイクルバグを修正した第三者作成のギャラリーがあります。オンラインでEcoGalleryを検索し、それを実装する方法を見つけることができます。ギャラリーをスクロールしている間に、グラフィックスのパフォーマンスが大幅に向上します。

+0

に配置されます。この問題はビューのリサイクルに関する問題ではなく、ASyncの読み込みとギャラリー内のビューを無効にするメソッドへの呼び出しです。 –

1

あなたは(a)スクロールが本当にゆっくりしているか、(b)convertViewをリサイクルしていないとうまくいくのですか?

は私が...手足に出て行って、それがないことを推測します

あなたがのgetItem()の前回の呼び出しからImageViewのをリサイクルするとき、あなたは関連するAsyncTaskをキャンセルしていないことであることの理由。同じImageViewを更新する複数のタスクがあります。これは、記述した動作と同じです。

+0

b)convertViewは常にnullです。a)ImageBitmapを完了してこの呼び出しを変更すると、ロードされているビューが実際に遅くなり、最後の位置にジャンプするので無効になります。 –

+0

ImageViewのコードはhttp://www.google.com/codesearch#uX1GffpyOZk/core/java/android/widget/ImageView.java&q=ImageView%20android&type=csで確認しました。私は問題を見る... setImageDrawable()をオーバーライドし、* requestLayout()を呼び出さないImageViewのサブクラスを使ってみてください。 –

3

正常に動作しない場合、私はかつてハックを作成しました。あなたが戻る直前に、あなたのdoInBackground()の終わりに

、ん:あなたは1つのビューのみを表示する(または指定したものは何でも数まで

int viewsOnScreen = 3; 
while(viewsOnScreen >= 1){ //adapt the numbers so that they work with your gallery, this is for a gallery with one visible child. 
    viewsOnScreen = getLastVisiblePosition() - getFirstVisiblePosition(); 
    SystemClock.sleep(100); 
} 

これはポイントはあなたです、あなたのイメージを更新してお待ちしております画面上に部分的なビューがありません。)、「ジャンプ」が気付かれなくなりました。あなたの問題にもギャラリー内の全く異なる位置にジャンプする必要がある場合は、ロードする前に選択したオブジェクトを確認し、ロード後にこのオブジェクトがどの位置にあるかを確認し、その位置にsetSelection()を呼び出してください。

しかし最初に他のすべてのソリューションを試してみてください...

+0

これは一種の解決策かもしれません。 –

+0

さて、私はこれに似た解決策に辿り着く(これは唯一の答えですが、私はキャッシュを行うように言わない)私はあなたの評判に報いるでしょう。 –

+0

ありがとうございます。あなたが本当の解決策を見つけたら、それを共有してください:) – Jave

1

あなたは、インターネットから画像を取得しLazyListの概念と間接的に画像をローカルに保存したとして、ギャラリーでのナビゲーションを滑らかにつながるローカルキャッシュに一時的プットを使用することができます

は、ここではあなたが実際の画像のダウンロードを開始する前に、デフォルトのビットマップを設定することができ、リンクhttps://github.com/thest1/LazyListまたはhttp://androidsnips.blogspot.com/2010/08/lazy-loading-of-images-in-list-view-in.html

+0

画像がプリロードされていることについての問題は、スクロールしている間に変更することです(getviewが呼び出された後にしばらく) –

+0

まあ、 –

+0

同じエラーが発生し、フォールトがGalleryで、フォルダーがonLayout()メソッド –

0

です。これは、空のビューは間違ったビットマップで設定されていないことを確認します。

// load defaultBmp in constructor. 

image.setBackgroundColor(Color.WHITE); 

image.setLayoutParams(new Gallery.LayoutParams(96, 170)); 

image.setImageBitmap(defaultBmp); // set the default bitmap (could be white). 
// execute AsyncTask here. 
+0

でも、ビットマップを変更するとinvalidate()が発生し、GalleryのonLayoutが呼び出され、奇妙なアニメーションがまだ発生します。 –

2

解決策が見つからない場合はこちらをご覧ください。

あなたはCustomGalleryが必要です。これはほぼ1:1のデフォルトのAndroid Galleryです。しかし、あなたはギャラリーを拡張することはできません、あなたはあなたのクラスに全体のソースコードをコピーする必要があります。 CustomAbsSpinnerクラスとCustomAdapterViewクラスで同じことを行う必要があります。すべてこれはあなたのCustomGalleryクラスの変更ではコードの一行だけ... を変更するonLayout()これまでの方法:

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 

    /* 
    * Remember that we are in layout to prevent more layout request from 
    * being generated. 
    */ 

    mInLayout = true; 

    /* 
    * Add if condition to avoid calling layout() unnecessarily: 
    * -when children calls onLayout after loading imageview 
    */ 
    if(changed || mDataChanged) 
     layout(0, false); 
    mInLayout = false; 
} 

これは、実際に必要なときにだけlayout()が呼び出されたことを原因となります。

ギャラリーの動作に別の既知のバグがあり、ギャラリーのジャンプがnotifyDataSetChanged()に発生します。あなたにもこのバグを持っている場合は、単にCustomAdapterViewクラスの1行をコメントアウト:とにかく

@Override 
    public void onChanged() { 
     mDataChanged = true; 
     mOldItemCount = mItemCount; 
     mItemCount = getAdapter().getCount(); 

     // Detect the case where a cursor that was previously invalidated has 
     // been repopulated with new data. 
     if (CustomAdapterView.this.getAdapter().hasStableIds() && mInstanceState != null 
       && mOldItemCount == 0 && mItemCount > 0) { 
      CustomAdapterView.this.onRestoreInstanceState(mInstanceState); 
      mInstanceState = null; 
     } else { 
      rememberSyncState(); 
     } 
     checkFocus(); 
     //comment this line to avoid gallery snap on notyfiDataSetChanged 
     //requestLayout(); 
    } 

、良い話題マルコス!ソリューションに私を導いてくれてありがとうありがとう。 カスタムクラスのソースが必要な場合は、教えてください。

EDIT(マルコス・ヴァスコンセロスによる):

これらのクラスのためのRの修正を得るためにコピーする必要がstyleables物事の束があります。 (誰もが、それは私達に連絡してください見つかった場合のresフォルダなし、)のAndroid 2.2のソースコードを検索している人のために

、これはここで見つけることができます。これは、することができ、APIの最新バージョンの http://en.newinstance.it/2010/12/01/android-sdk-2-2_r2-sources/

をトラストSDKマネージャを実行し、/ sources/android-

+0

あなたの答えをありがとうが、私は自分のギャラリーを最初から作成して解決しました(多くの翻訳といくつかの数学もあります)。しかし、このおかげで、これはしばらくの間役に立ちました。 –

+0

私にそのコードを送ってもらえますか?私はフルスクリーンセルだけを表示するためにそれを解決しました、私はアイテムのためのギャラリーの動作も必要です。ありがとうございます –

+0

このソリューションは素晴らしいです!どうもありがとう。 –

関連する問題

 関連する問題