onLoadFinished 使用错误数据调用,即使 loadInBackground returns 正确数据
onLoadFinished called with wrong data even if loadInBackground returns correct data
我正在制作一个应用来显示电影列表,如屏幕截图所示。
问题是,当我 select 选项菜单 top_rated 选项时,它会重新加载正确的数据,但是 return 到 onLoadFinished 的列表包含以前的数据之后的新数据.
如何纠正此问题,因为我只希望新数据出现在列表中。我尝试了 onLoaderReset 但它没有被调用,因为 activity 没有被破坏而且我找不到任何其他方法来取消引用旧数据或者换句话说 首先清空旧的已经获取的列表,然后用新获取的列表替换它.
如何实现以上..?
还有一件事,每当我转到任何其他 activity 然后 return 返回时,显示的数据都是重复的。我知道这可能是一个生命周期问题,可以通过一些研究来解决,但只有第一个问题得到解决我才能做到这一点。
这是应用程序的屏幕截图:-
更新 --> 实际问题不在 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 适配器 中的数据来完成,然后重新加载数据。
这进入你的 RecyclerView Adapter Class.
public void cleatMovieData(){
int size = movieDetails.size();
if (size > 0) {
for (int i = 0; i < size; i++) {
movieDetails.remove(0);
}
notifyItemRangeRemoved(0,size);
}
}
调用Loader重启前可以调用该方法
这是我在问题中引用的答案:-
这是我在 MainActivity.java 中调用的 JSONUtils.java 函数:-
public static ArrayList<String[]> parseMovieJSON(String jsonReceived){
movieTitleAndPosterList.clear();
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;
}
由于这里的 ArrayList 是 static 因此我必须在添加新数据之前 clear 它。
因为我没有清除它,数据总是附加到列表中,因此返回到 onLoadFinished 的列表有重复的项目。
感谢@KavinRajuS 花时间帮助我解决这个问题。
因此,问题现已解决,应用程序运行良好。
我正在制作一个应用来显示电影列表,如屏幕截图所示。
问题是,当我 select 选项菜单 top_rated 选项时,它会重新加载正确的数据,但是 return 到 onLoadFinished 的列表包含以前的数据之后的新数据.
如何纠正此问题,因为我只希望新数据出现在列表中。我尝试了 onLoaderReset 但它没有被调用,因为 activity 没有被破坏而且我找不到任何其他方法来取消引用旧数据或者换句话说 首先清空旧的已经获取的列表,然后用新获取的列表替换它.
如何实现以上..?
还有一件事,每当我转到任何其他 activity 然后 return 返回时,显示的数据都是重复的。我知道这可能是一个生命周期问题,可以通过一些研究来解决,但只有第一个问题得到解决我才能做到这一点。
这是应用程序的屏幕截图:-
这是我在 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 适配器 中的数据来完成,然后重新加载数据。
这进入你的 RecyclerView Adapter Class.
public void cleatMovieData(){
int size = movieDetails.size();
if (size > 0) {
for (int i = 0; i < size; i++) {
movieDetails.remove(0);
}
notifyItemRangeRemoved(0,size);
}
}
调用Loader重启前可以调用该方法
这是我在问题中引用的答案:-
这是我在 MainActivity.java 中调用的 JSONUtils.java 函数:-
public static ArrayList<String[]> parseMovieJSON(String jsonReceived){
movieTitleAndPosterList.clear();
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;
}
由于这里的 ArrayList 是 static 因此我必须在添加新数据之前 clear 它。
因为我没有清除它,数据总是附加到列表中,因此返回到 onLoadFinished 的列表有重复的项目。
感谢@KavinRajuS 花时间帮助我解决这个问题。 因此,问题现已解决,应用程序运行良好。