0

ここでAndroidを初めて使用します(およびプログラミング全般)

この例に従って、遅延画像読み込みアダプターを作成しようとしています : http://thinkandroid.wordpress.com/2012/06/13/lazy-loading-images-from-urls-to-listviews/ Student の代わりに Album" を使用しますが、それ以外はほとんど同じです。

アダプターから次のように呼び出すと:

Album getItem(int position) {
    return items.get(position);
}

「タイプの不一致: オブジェクトからアルバムに変換できません」というメッセージが表示されます。サンプルからコードをそのままコピーしようとしましたが、同じエラーが発生しました..

誰かが私が間違っていることと、それを修正する方法を説明してもらえますか? ありがとうございました。

コードは次のとおりです。

アルバムのクラス:

package another.music.player;

import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.util.Log;

public class Album {

    private String album;

    private String imageUri;

    private Bitmap image;

    private AlbumAdapter albumAdapter;

    public Album(String album, String imageUri) {

        this.album = album;
        this.imageUri = imageUri;

        // Default image
        this.album = null;
    }

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }

    public String getImageUri() {
        return imageUri;
    }

    public void setImageUri(String imageUri) {
        this.imageUri = imageUri;
    }

    public Bitmap getImage() {
        return image;
    }

    public AlbumAdapter getAdapter() {
        return albumAdapter;
    }

    public void setAdapter(AlbumAdapter albumAdapter) {
        this.albumAdapter = albumAdapter;
    }

    public void loadImage(AlbumAdapter albumAdapter) {
        // Hold a reference to the adapter
        this.albumAdapter = albumAdapter;
        if (imageUri != null && !imageUri.equals("")) {
            new ImageLoadTask().execute(imageUri);
        }
    }

    // Async task
    private class ImageLoadTask extends AsyncTask<String, String, Bitmap> {
        @Override
        protected void onPreExecute() {
            Log.i("ImageLoadTask", "Loading Image..");
        }

        // Param[0] is Image URI
        protected Bitmap doInBackground(String... param) {
            Log.i("ImageLoadTask", "Attempting to load image Uri: " + param[0]);
            try {
                Bitmap bitmap = ImageService.getBitmapFromURI(param[0]);
                return bitmap;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

        protected void onProgressUpdate(String... progress) {
            // No Op
        }

        protected void onPostExecute(Bitmap ret) {
            if (ret != null) {
                Log.i("ImageLoadTask", "Successfully loaded" + album + " image");
                image = ret;
                if (albumAdapter != null) {
                    // When image is loaded, notify the adapter
                    albumAdapter.notifyDataSetChanged();
                }
            } else {
                Log.e("ImageLoadTask", "Failed to load " + album + " image");
            }
        }
    }
}

AlbumAdapter クラス:

package another.music.player;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class AlbumAdapter extends BaseAdapter {

    private LayoutInflater mInflater;

    private List items = new ArrayList();

    public AlbumAdapter(Context context, List items) {
        mInflater = LayoutInflater.from(context);
        this.items = items;
    }

    public int getCount() {
        return items.size();
    }

    public Album getItem(int position) {
        return items.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        Album album = items.get(position);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.row_layout, null);
            holder = new ViewHolder();
            holder.name = (TextView) convertView.findViewById(R.id.name);
            holder.image = (ImageView) convertView.findViewById(R.id.image);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.name.setText(album.getName());
        if (s.getImage() != null) {
            holder.pic.setImageBitmap(s.getImage());
        } else {
                // MY DEFAULT IMAGE
            holder.pic.setImageResource(R.drawable.generic_profile_man);
        }
        return convertView;
    }

    static class ViewHolder {
        TextView name;

        ImageView pic;
    }

}
4

3 に答える 3

2

インスタンスListを含むジェネリックがあります。Objectこれは、クラスの任意のインスタンスObjectまたは拡張するクラスObject(基本的にそれらすべて) を意味します。そのリストからアイテムを取得しようとすると、コンパイラはそれが であることを認識しますが、メソッドのシグネチャは;Objectを返すと言っています。Albumコンパイラは、リストから取得している要素が間違いなく であることを認識してAlbumいないため、コードをコンパイルできません。

これを解決するには、2 つの方法のいずれかを使用します。クラスListのインスタンスのみを含むように宣言できます。Album

List<Album> items = new ArrayList<Album>();

または、リストから取得しているオブジェクトをキャストして、そうでない場合でもそれが偶数であることを明確にコンパイラに伝えることができます。Album

Album getItem(int position) {
    return (Album)items.get(position);
}
于 2012-08-01T09:59:59.450 に答える
1

この方法でリストを作成してみてください。

List<Album> items = new ArrayList<Album>();
于 2012-08-01T09:53:10.597 に答える
1

List/ArrayList の特殊な形式を使用するか、結果を自分でキャストする必要があります。

Album getItem(int position) {
    return (Album)items.get(position);
}

またはそれ以上:

private List<Album> items = new ArrayList<Album>();
于 2012-08-01T09:56:33.710 に答える