1

質問があります。ImageView を使用して画像をロードしている GridView があります。これらの画像は SD に保存されているため、ロードに Runnable クラスを使用しています。GridView をスクロールすると、対応するボックス (ImageView) に画像が読み込まれ、他のテーブルでも、音楽のアルバムのリストのようなものを作成しています。画像はアルバムに読み込まれますが、読み込まれます別のものなど、どうすれば同期させることができますか?つまり、ある充電が別の充電にロードされない場合

私が理解してくれることを願っています

ありがとう

PD: 私の英語でごめんなさい

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) getContext().getSystemService("layout_inflater");
        v = vi.inflate(R.layout.listitemalbum, null);
    }

    bnSong = songs.get(position);
    if (bnSong != null) {
        coverAlbum = (ImageView) v.findViewById(R.id.imgCover);
        coverAlbum.setScaleType(ImageView.ScaleType.CENTER_CROP);

        if (bnSong.getAlbum() == null){
            coverAlbum.setBackgroundResource(R.drawable.mksong);
        }else{
            try {
                Runnable r = new Runnable() {
                    @Override
                    public void run() {
                        try{
                            Thread.sleep(1000);                                 
                            Storage storage = new Storage();                                
                            cover = storage.getOpenImagen(bnSong.getAlbum(), "ALBUM");
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                        coverAlbum.post(new Runnable() {
                            @Override
                            public void run() {
                                coverAlbum.invalidate();
                                coverAlbum.setImageBitmap(null);
                                if (cover != null){
                                    coverAlbum.setImageBitmap(cover);
                                }else {
                                    coverAlbum.setBackgroundResource(R.drawable.mksong);
                                }
                            }
                        });
                    }
                };
                new Thread(r).start();
            } catch (Exception e) {
                coverAlbum.setBackgroundResource(R.drawable.mksong);
            }
        }
    }
    return v;
}
4

2 に答える 2

1

「ボレー」と呼ばれるGoogleチームによってリリースされた、まさにあなたの問題に特化したライブラリがあります。かなり新しいですけどね。ここの情報: https://developers.google.com/live/shows/474338138/ .

ただし、ライブラリを使用せずに問題を解決するには、まず、実行可能なスレッドで Android AsyncTask とexecuteOnExecutor(THREAD_POOL_EXECUTOR)メソッドを使用する必要があります。画面上のすべてのビューに加えて、スクロールするたびに新しいスレッドを作成しています。本当に実行可能ファイルでこれを行いたい場合は、ExecutorService を使用してスレッド プールを作成し、そこに実行可能ファイルを投稿します。

今、あなたが抱えている問題は、ビューが再利用されたときにイメージが上書きされることです。必要なことは、画像をダウンロードした後、ビュー位置のアイテムが同じアルバムであることを確認することです。これは、多くの場合、ビューにタグを付けて行うのが最適です。

public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
    LayoutInflater vi = (LayoutInflater) getContext().getSystemService("layout_inflater");
    v = vi.inflate(R.layout.listitemalbum, null);
}

final Song song = songs.get(position);
if (song != null) {
    final ImageView coverAlbum = (ImageView) v.findViewById(R.id.imgCover);
    coverAlbum.setScaleType(ImageView.ScaleType.CENTER_CROP); // Why not do this once, at inflation?

    final Album album = song.getAlbum();
    coverAlbum.setTag(album);        

    if (album == null){
        coverAlbum.setBackgroundResource(R.drawable.mksong);
    }else{
        // This should really be in a full class which extends AsyncTask
        AsyncTask<Album, Void, Bitmap> task = new AsyncTask<Album, Void, Bitmap>() {
            @Override
            public Bitmap doInBackground(Album... albums) {
                final Album album = albums[0];
                try{
                    Storage storage = new Storage();                                
                    return storage.getOpenImagen(album, "ALBUM");
                }catch (Exception e){
                    e.printStackTrace();
                    return null;
                }
            }

            @Override
            protected void onPostExecute(Bitmap cover) {
                final Album currentAlbum = (Album) coverAlbum.getTag();
                if(!album.equals(currentAlbum))
                    return;

                coverAlbum.invalidate();
                coverAlbum.setImageBitmap(null);
                if (cover != null){
                    coverAlbum.setImageBitmap(cover);
                }else {
                    coverAlbum.setBackgroundResource(R.drawable.mksong);
                }
            }
        }

        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, album)
    }
}
return v;
于 2013-05-22T13:03:20.077 に答える