android - 即使 loadInBackground 返回正确的数据,也会使用错误的数据调用 onLoadFinished

标签 android android-lifecycle asynctaskloader

我正在制作一个应用来显示电影列表,如屏幕截图所示。

问题是,当我选择选项菜单 top_rated 选项时,它会重新加载正确的数据,但返回到 onLoadFinished 的列表包含以前的数据和之后的新数据

我该如何纠正这个问题,因为我只希望列表中有新数据。我尝试了 onLoaderReset 但它没有被调用,因为 Activity 没有被破坏,我无法找到任何其他方法来取消引用旧数据或者换句话说 首先清空旧的已经获取的列表然后用新获取的列表替换它

如何实现上述...?

还有一件事,每当我去任何其他 Activity 然后返回时,显示的数据都是重复的。我知道这可能是一个生命周期问题,可以通过一些研究来解决,但只有第一个问题得到解决我才能这样做。

这是应用程序的屏幕截图:- Screenshot of MainActivity 更新 --> 实际问题不在 MainActivity.java 中,而是在下面的文件中,因此问题现在已解决,如我的回答中所述。

这是我在 MainActivity.java 中调用的 JSONUtils.java 函数:-

import com.example.trishantsharma.popularmovies.Movie;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class JSONUtils {
private static ArrayList<String[]> movieTitleAndPosterList = new ArrayList<>();
//ALL CONSTANTS HERE
public static ArrayList<String[]> parseMovieJSON(String jsonReceived){
    //THE PROBLEM IS HERE AND HAS BEEN RECTIFIED IN THE ANSWER
    try {
        JSONObject movieObject = new JSONObject(jsonReceived);
        JSONArray allMoviesArray = movieObject.getJSONArray(RESULT_JSON_ARRAY_STRING);
        for (int i = 0; i < 19; i++) {
            JSONObject particularMovie = allMoviesArray.optJSONObject(i);
            String movieId = Integer.toString(particularMovie.optInt(ID_JSON_OBJECT_STRING));
            String moviePoster = particularMovie.optString(POSTER_JSON_OBJECT_STRING);
            String[] singleMovieTitleAndPosterArray = {movieId,moviePoster};
            movieTitleAndPosterList.add(singleMovieTitleAndPosterArray);
        }
        return movieTitleAndPosterList;
    } catch (JSONException e){
        e.printStackTrace();
    }
    return null;
}
}

谢谢。

最佳答案

这可以通过清除 RecyclerView Adapter 中的数据来完成,当您单击菜单中的一个选项,然后重新加载数据。

这会进入您的 RecyclerView 适配器类。

 public void cleatMovieData(){
    int size = movieDetails.size();
    if (size > 0) {
        for (int i = 0; i < size; i++) {
            movieDetails.remove(0);
        }
        notifyItemRangeRemoved(0,size);
    }
}

可以在调用Loader重启之前调用该方法。

关于android - 即使 loadInBackground 返回正确的数据,也会使用错误的数据调用 onLoadFinished,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50887234/

相关文章:

Android 崩溃时停止服务

Android onTouch(View,MotionEvent) 未被调用但 onTouchEvent(MotionEvent event) 被调用?

android - 选项卡的奇怪行为

android - Activity 生命周期的奇怪行为 - 在 onResume() 之后也调用了 onPause() ...为什么?

android - 如何从 RecyclerView 清除数据监听器/订阅?

android - 在没有 Fragment 的情况下使用 LoaderCallbacks

java - 集成加载器和回收器 View 不起作用

android - 一个 Activity 或 fragment 必须有一个单独的加载程序来执行每个数据库操作的类型吗?

android - 同步android sqlite数据库

android - 我可以在 Cordova Android 应用程序和嵌入式设备(棋盘)之间传输数据吗?