【问题标题】:Android Pagination: Using APIs with Retrofit and Gson (Crash)Android 分页:使用带有 Retrofit 和 Gson 的 API(崩溃)
【发布时间】:2017-08-23 23:52:56
【问题描述】:

我正在使用带有 Retrofit 和 Gson 的 TMDB 电影 API 实现 Android 分页。一个名为“评分最高的电影”的选项卡将显示评分最高的电影图像,并通过 TMDB API 进行分页。

日志:

FATAL EXCEPTION: main
                                               Process: me.saidur.movietune, PID: 23778
                                               java.lang.ClassCastException: me.saidur.movietune.activity.MovieTuneActivity cannot be cast to me.saidur.movietune.utils.PaginationAdapterCallback
                                                   at me.saidur.movietune.fragments.PaginationAdapter.<init>(PaginationAdapter.java:53)
                                                   at me.saidur.movietune.fragments.TopRated.onCreateView(TopRated.java:117)

TopRated.java 片段类文件如下:

public class TopRated extends Fragment implements PaginationAdapterCallback {

private static final String TAG = NewRelease.class.getSimpleName();
// Inset your themoviedb.org api key
private final static String API_KEY = "...";


List<Movie> results;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment_top_rated, container, false);

    progressBar = (ProgressBar) v.findViewById(R.id.main_progress);
    errorLayout = (LinearLayout) v.findViewById(R.id.error_layout);
    btnRetry = (Button) v.findViewById(R.id.error_btn_retry);
    txtError = (TextView) v.findViewById(R.id.error_txt_cause);

adapter = new PaginationAdapter(getContext()); // 问题在这里提出

    recyclerView = (RecyclerView) v.findViewById(R.id.movies_recycler_view);
    linearLayoutManager = new LinearLayoutManager(getActivity());
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayoutManager);

    recyclerView.setAdapter(adapter);

    recyclerView.addOnScrollListener(new PaginationScrollListener(linearLayoutManager) {
        @Override
        protected void loadMoreItems() {
            isLoading = true;
            currentPage += 1;

            loadNextPage();
        }

        @Override
        public int getTotalPageCount() {
            return TOTAL_PAGES;
        }

        @Override
        public boolean isLastPage() {
            return isLastPage;
        }

        @Override
        public boolean isLoading() {
            return isLoading;
        }
    });

    //init service and load data
    apiService = ApiClient.getClient().create(ApiInterface.class);

    loadFirstPage();

    btnRetry.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            loadFirstPage();
        }
    });

    return v;
}

@Override
public void retryPageLoad() {
    loadNextPage();
}


private void loadFirstPage() {
    Log.d(TAG, "loadFirstPage: ");

   .....
   ....
}

private void loadNextPage() {
    .....
    .....
}

}

PaginationAdapter.java 文件如下:

公共类 PaginationAdapter 扩展 RecyclerView.Adapter {

// View Types
private static final int ITEM = 0;
private static final int LOADING = 1;
private static final int HERO = 2;

private static final String BASE_URL_IMG = "https://image.tmdb.org/t/p/w150";

private List<Movie> movieResults;
private Context context;

private boolean isLoadingAdded = false;
private boolean retryPageLoad = false;

private PaginationAdapterCallback mCallback;

private String errorMsg;

public PaginationAdapter(Context context) {
    this.context = context;

this.mCallback = (PaginationAdapterCallback)context;// 引发问题 这里

    movieResults = new ArrayList<>();
}

public List<Movie> getMovies() {
    return movieResults;
}

public void setMovies(List<Movie> movieResults) {
    this.movieResults = movieResults;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder = null;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

....... ..................... .....................(更多代码)

我无法弄清楚为什么会发生崩溃的问题。有什么办法可以解决这个问题?

提前致谢。

【问题讨论】:

  • 好吧,您从 Fragment 调用的 getContext() 方法返回 Fragment 的父 Activity。然后,您尝试将其转换为PaginationAdapterCallback。这应该如何工作?
  • @KirillStarostin 感谢您的回复。你能分享一下可以做些什么来解决这个问题吗?
  • 不要这样投。什么是PaginationAdapterCallback 类?
  • 这里是 PaginationAdapterCallback 类: ================================== 公共接口 PaginationAdapterCallback { 无效重试页面加载(); }
  • 好的。那么MovieTuneActivity是否正确实现了这个接口呢?

标签: android pagination retrofit2


【解决方案1】:
adapter = new PaginationAdapter(getContext());

TopRated Fragment 调用的getContext() 实际上返回MovieTuneActivity 的对象,正如您所说,它没有实现接口PaginationAdapterCallback。这就是你得到这个异常的原因。

由于TopRated Fragment 实现了这个接口,我想你想做的是:

  1. 在您的PaginationAdapter 类中向构造函数添加第二个参数:

    public PaginationAdapter(Context context, PaginationAdapterCallback callback) {
        this.context = context;
        this.mCallback = callback;
        movieResults = new ArrayList<>();
    }
    
  2. 在您的TopRated 片段中,将其实例传递给适配器,因为片段实现了PaginationAdapterCallback 接口:

    adapter = new PaginationAdapter(getContext(), this);
    

这应该可以完成工作。虽然我不确定在 Adapter 中存储对 Fragment 的引用是个好主意。

【讨论】:

    猜你喜欢
    • 2015-03-31
    • 2021-01-07
    • 1970-01-01
    • 2017-08-05
    • 2018-02-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多