2014-09-30 32 views
2

我試圖從我的適配器中使用InterfaceAsyncTask時得到java.lang.ClassCastException。我不知道這是否是'允許的',但我不明白爲什麼只要一切都保持在上下文中就不會。類別轉換異常,從AsyncTask內部適配器

當我嘗試使用自定義Adapter設置我的GridView時,代碼開始於我的Fragment

mSceneGridAdapter = new SceneGridAdapter(getActivity(), mScenesList); 

導致我SceneGridAdapter類被稱爲

public class SceneGridAdapter extends BaseAdapter implements HandleProductThumbnail { 
    private Context mContext; 
    private ArrayList<Scene> mSceneList = null; 
    private LayoutInflater mInflater; 
    private Drawable mThumbnail; 

    public SceneGridAdapter() {} 

    public SceneGridAdapter(Context context, ArrayList<Scene> sceneList) { 
     super(); 

     mContext = context; 
     if (mSceneList != null) { 
      clearData(); 
     } else { 
      mSceneList = sceneList; 
     } 

     mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.scene_cell, null); 
     } 

     ImageView sceneView = (ImageView) convertView.findViewById(R.id.sceneImage); 

     Scene scene = mSceneList.get(position); 
     String specifier = scene.getSpecifier() + "/" + scene.getName(); 
     LoadScenes scenes = new LoadScenes(mContext, specifier); 
     scenes.execute(); 
     sceneView.setBackground(mThumbnail); 

     return convertView; 

    } 

    @Override 
    public int getCount() { 
     return mSceneList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mSceneList.get(position); 
    } 

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

    public void clearData() { 
     mSceneList.clear(); 
    } 

    @Override 
    public void handleProductThumbnail(Drawable thumb) { 
     mThumbnail = thumb; 
    } 
} 

它實現了我的Interface HandleProductThumbnails

public interface HandleProductThumbnail { 
     void handleProductThumbnail(Drawable thumb); 
} 

,然後叫我叫LoadScenes AsyncTask裝載機類,它加載縮略圖和回報他們到適配器。

public class LoadScenes extends AsyncTask<Void, Void, Drawable> { 
    private static final String LOADING = "Loading..."; 
    private static final String PNG = "_ORIGINAL.PNG"; 

    private Context mContext; 
    private HandleProductThumbnail mHandleThumbnail = null; 
    private ProgressDialog mProgressDialog; 
    private String mSpecifier; 

    public LoadScenes() {} 

    public LoadScenes (Context context, String specifier) { 
     mContext = context; 
     mSpecifier = specifier; 
    } 

    @Override 
    public void onPreExecute() { 
     mProgressDialog = new ProgressDialog(mContext); 
     mProgressDialog.setMessage(LOADING); 
     mProgressDialog.show(); 
    } 

    public Drawable doInBackground(Void... v) { 
     Drawable productThumbnail = getDrawable(mSpecifier); 
     return productThumbnail; 
    } 

    public void onPostExecute(Drawable productThumbnail) { 
     mProgressDialog.dismiss(); 
     mHandleThumbnail = (HandleProductThumbnail) mContext; 
     mHandleThumbnail.handleProductThumbnail(productThumbnail); 
    } 

    public Drawable getDrawable(String specifier) { 
     Bitmap bmp = null; 
     Drawable productThumbnail = null; 
     specifier = specifier.replace("\\", "/") + PNG; 
     try { 
      bmp = BitmapFactory.decodeStream(mContext.getAssets().open(specifier)); 
      if (bmp != null) { 
       int width = 300; 
       int height = 240; 
       bmp = Bitmap.createScaledBitmap(bmp, width, height, true); 
       productThumbnail = new BitmapDrawable(mContext.getResources(), bmp); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return productThumbnail; 
    } 
} 

,最後我的日誌

09-30 10:34:35.725: E/AndroidRuntime(22442): java.lang.ClassCastException: com.example.xxx.visualizer.VisualizerActivity cannot be cast to com.example.xxx.interfaces.HandleProductThumbnail 
09-30 10:34:35.725: E/AndroidRuntime(22442): at com.example.xxx.visualizer.LoadScenes.onPostExecute(LoadScenes.java:46) 

Fragment連接到名爲VisualizerActivity的Activity,並正在傳遞的所有方面來自於Activity。雖然這個問題有點層次,但代碼很模板化。我想知道我是否正在做一些不允許的事情?從我的理解Context這應該工作。請讓我知道我做錯了什麼,爲什麼,如果它可以修復。謝謝

回答

1

看起來你的活動沒有實現HandleProductThumbnail,但你的自定義適配器。在你的情況,而不是鑄造,我寧願一個方法添加到AsyncTask子類:

public void setHandleProductThumbnail(HandleProductThumbnail listener) { 
      mHandleThumbnail = listener; 
    } 

和內部OnPostExecute

public void onPostExecute(Drawable productThumbnail) { 
    mProgressDialog.dismiss(); 
    if (mHandleThumbnail != null) 
     mHandleThumbnail.handleProductThumbnail(productThumbnail); 
} 
+0

這是正確的,我的活動沒有實現我的接口。我的適配器是。我的適配器在設置我的GridView之前執行此操作。如果我將Drawable返回到我的活動中,那麼我將如何將它傳遞迴適配器?你看到問題了嗎? – Jawascript 2014-09-30 15:10:54

+0

您不會將drawable返回到活動,而是返回適配器。特別是你將結果返回給類接口 – Blackbelt 2014-09-30 15:12:04

+0

這對我有用。謝謝! – Jawascript 2014-09-30 15:33:05

0

你的問題是在這裏:

mHandleThumbnail = (HandleProductThumbnail) mContext; 

你」重新鑄造mContextHandleProductThumbnailmContextContext,因此不實現您的自定義界面。如果您需要參考HandleProductThumbnail,請將其作爲構造函數參數傳遞。

最後注意:如果您想要在每個列表項上加載縮略圖,我會建議使用Picasso,這會讓您更加簡單。

+0

這對我有意義,謝謝畢加索的建議。 – Jawascript 2014-09-30 15:13:50

0

顯而易見,它會創建一個類別轉換異常, ,因爲mContext是您的活動未實現「HandleProductThumbnail」接口的活動對象。

雖然通過右鍵鑄造糾正你的代碼,但它會產生錯誤,由於下面的代碼行適配器

LoadScenes scenes = new LoadScenes(mContext, specifier); 
    scenes.execute(); 
    sceneView.setBackground(mThumbnail); 

因爲第二行是一個異步調用,並mThumbnail將是零。您可以運行另一種方法來在運行時從URL呈現圖像。