2011-10-30 9 views
2

私は、各リストアイテムに1つ以上のクリック可能な画像を含むことができるリストビューを持っています。それらをクリックすると、画像のフルスクリーン版を表示するアクティビティが開始されます。OnClickListenersが一貫して発砲しない

ListItemの画像ごとに、GetView()の実装内にを設定します(やや簡略化)。これは完全に機能しました。

ImageView imageView = (ImageView)convertView.findViewById(R.id.image_res); 
imageView.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     ActivityLauncher.startPhotoViewerActivity(mContext, item); 
    } 
}); 

ただし、パフォーマンスを向上させるために、初めてビューを作成した後で、各ビューをメモリに保存することにしました。私はconvertViewの代わりに4-5種類のビューがあり、コードで動的に構築されるため再利用が困難になるため、これを行います。

メモリにビューを格納してから、後でその位置に基づいてgetView()を呼び出すときに、既に構築されたビューを返すと、パフォーマンスは大幅に向上しますが、OnClickListenersはファンキーな動作を開始します。

具体的には、特定の画像をタップすると、その画像のOnClickListenerが直ちに起動するか、まったく起動しない可能性があります。直ちに発射しない場合、スクロールを開始すると直ちに発射することがあります。これによりOnClickListenerが実行されない場合は、戻るをクリックするとアクティビティが終了します。これがトリガーされない場合は、BACKを押してすべてのアクティビティを終了してからアプリを再入力すると、キューに入れられたすべてのものがトリガーされますOnClickListeners。あるケースでは、結果を出さずにさまざまな画像で25回クリックしました。それから、すべてのアクティビティを閉じてから、もう一度アプリケーションアイコンをクリックすると、25個の画像プレビューがすべて開きました。

この原因は何ですか?私にとって興味深いのは、OnClickListenersが、ある時点で写真ビューアのアクティビティを開くため、明らかに正しく設定されていることです。間違ったイメージは決して開かれず、絶対に発砲しない場合はありません。問題は、すぐに、または後で発射する可能性があることです。

各リスト項目のビューを保存して、私が行っているようにgetView()内の位置に基づいてそれらを戻すことはお勧めしませんか?どんな助けでも大歓迎です。

+1

'getView()'メソッド全体を投稿する必要があります。そうしないと、この特定の動作がなぜ発生しているのかを診断することは非常に難しくなります。 – dmon

答えて

3

Google I/Oで与えられたListViewについての話を見てください。 13:45に、ビューをキャッシュして戻すことを特に警告します。これを行うと、それは私が経験しているものとまったく変わった動作につながる可能性があります。このことを考えると、問題は疑問です。

http://www.youtube.com/watch?v=wDBM6wVEO70

希望これは、将来的に誰かが同じ落とし穴を避けることができます。ビューのキャッシュは推奨されません。