在片段上使用LoaderManager.LoaderCallbacks <arraylist <moviedatacollection >>并得到错误:java.lang.ClassCastException

时间:2019-03-07 14:14:52

标签: android android-fragments android-viewpager android-loadermanager async-loading

我正在尝试在一个片段上使用LoaderCallbacks(从android.app.LoaderManager导入),但是当我完成所有编码并尝试运行它时,它给我一个错误提示

  

java.lang.ClassCastException:_.MovieDataCollection无法强制转换为   java.util.ArrayList位于   _.Detailed.CastFragment.onLoadFinished(CastFragment.java:34)

LoaderManager的实现:

public class CastFragment extends Fragment implements LoaderManager.LoaderCallbacks<ArrayList<MovieDataCollection>> {

在Loader的onCreateView初始化中:

LoaderManager loaderManager = getActivity().getLoaderManager();
        loaderManager.initLoader(1, null, this);

在Loader的onCreateLoader内部:

@Override
public Loader<ArrayList<MovieDataCollection>> onCreateLoader(int i, Bundle bundle) {
    progressBar.setVisibility(View.VISIBLE);
    return new WorkerCastThread(getContext(), String.valueOf(movieId));
}

在Loader的onLoadFinished内部:

@Override
public void onLoadFinished(Loader<ArrayList<MovieDataCollection>> loader, ArrayList<MovieDataCollection> movieDataCollections) {
    if (movieDataCollections == null) {
        showErrorMessage();
    } else {
        showData();
        ArrayList<String> imagePath = new ArrayList<>();
        for (int i = 0; i < movieDataCollections.size(); i++) {
            imagePath.add(movieDataCollections.get(i).getPoster_path());
        }
        castAdapter = new CastAdapter(movieDataCollections);
        recyclerView.setAdapter(castAdapter);
        recyclerView.setHasFixedSize(true);
    }
    progressBar.setVisibility(View.INVISIBLE);

}

内部后台工作线程AsyncTaskLoader:

public class WorkerCastThread extends AsyncTaskLoader<ArrayList<MovieDataCollection>> {

private final String movieId;

public WorkerCastThread(Context context, String movieId) {
    super(context);
    this.movieId = movieId;
}

@Override
protected void onStartLoading() {
    forceLoad();
}

@Override
public ArrayList<MovieDataCollection> loadInBackground() {
    ArrayList<MovieDataCollection> movieDataCollection = null;
    NetworkUtils networkUtils = null;
    if (movieId != null) {
        networkUtils = new NetworkUtils(movieId);
    }
    if (networkUtils != null) {
        movieDataCollection = networkUtils.fetchDataCredits(movieId);

    }
    return movieDataCollection;
}

}

MovieDataCollection签名:

public class MovieDataCollection implements Serializable {}

我的感觉是因为MovieDataCollection实现了Serializable,这就是为什么它发生了,但是在MainActicity中,使用了相同的LoaderManager实现,它可以正常工作并且可以正确加载数据而没有任何错误。

MainActivity类:

public class MainActivity extends AppCompatActivity implements MoviesAdapter.MoviesAdapterOnClickHandler, LoaderManager.LoaderCallbacks<ArrayList<MovieDataCollection>> {

enter image description here

0 个答案:

没有答案