2012-08-01 16 views
0

新來這裏機器人,(和一般的編程)安卓:「不能從對象轉換爲專輯」(冊頁是一類..)

我下面這個例子試圖建立一個懶圖像加載適配器:http://thinkandroid.wordpress.com/2012/06/13/lazy-loading-images-from-urls-to-listviews/ 我使用「相冊」而不是學生,但其餘的幾乎相同。

當我打電話從我的適配器如下:

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

我得到「類型不匹配:不能從對象轉換爲專輯」。我試圖複製代碼從逐字逐句,我得到了同樣的錯誤..

有人請解釋我做錯了什麼,以及如何解決它?謝謝。

下面是代碼:

Album類:

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; 
    } 

} 

回答

2

你有一個通用的List,其中將包含Object實例。這意味着Object課程的任何實例或延伸Object(基本上都是這些課程)的課程。當你試圖從列表中獲取一個項目時,編譯器知道它是一個Object,但是你的方法簽名是說你要返回一個Album;編譯器不知道你從列表中檢索的元素肯定是Album,所以它不能編譯代碼。

你可以解決這是兩種方法之一。你可以宣佈你的List只包含Album類的實例:

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

或者你可以投你從列表中獲取對象,告訴是明確的,它是一個Album甚至編譯器如果不是:

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

謝謝您提供豐富的答案。 (並感謝所有其他人) – 2012-08-01 10:01:30

1

試着讓你的清單是這樣的:

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

感謝您的快速響應。 – 2012-08-01 10:02:16

1

你應該使用專門的m/List/ArrayList,或者自己施放結果。

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

或更好:

private List<Album> items = new ArrayList<Album>(); 
相關問題