在适配器中添加 ArrayList 时出现问题
Problem while adding ArrayList in adapter
我正在用 ArrayList 填充 RecyclerView 的适配器。列表包含模型对象 class,它保存来自服务器的数据。并且需要加载到Tab Fragment中。
我已经尝试了我所知道的关于列表生命周期的一切,似乎这个列表在那个周期的某个时刻从内存中删除了。
这是代码的相关部分:
public class TrueFragment extends Fragment {
public static List<AllPositiveModel> newsList = new ArrayList<>();
private RecyclerView recyclerView;
private NewsAdapterTrue adapter;
private OnFragmentInteractionListener mListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_true, container, false);
recyclerView = rootView.findViewById(R.id.recycler_view_true);
newsList = getResult();
adapter = new NewsAdapterTrue(newsList, getActivity());
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
return rootView;
}
public List<AllPositiveModel> getResult(){
final List<AllPositiveModel> items = new ArrayList<>();
GETAll getApiService;
getApiService = ApiUtils.getAPIServiceFetchAll();
getApiService.getAllNews().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) {
if (response.body() != null) {
Log.i("onSuccess", response.body());
String jsonresponse = response.body();
try {
//getting the whole json object from the response
JSONObject obj = new JSONObject(response.body());
JSONArray dataArray = obj.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
String title, desc, link, date, img, paper;
final Integer id, positive, negative;
JSONObject dataobj = dataArray.getJSONObject(i);
AllPositiveModel item = new AllPositiveModel(dataobj.getInt("id"), dataobj.getString("title"),
dataobj.getString("description"), dataobj.getString("link"),
dataobj.getString("date"), dataobj.getString("image"),
dataobj.getInt("positive_votes"), dataobj.getInt("negative_votes"),
dataobj.getString("paper"));
id = dataobj.getInt("id");
title = dataobj.getString("title");
desc = dataobj.getString("description");
link = dataobj.getString("link");
date = dataobj.getString("date");
img = dataobj.getString("image");
positive = dataobj.getInt("positive_votes");
negative = dataobj.getInt("negative_votes");
paper = dataobj.getString("paper");
items.add(item);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.i("onEmptyResponse", "Returned empty response");
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
return items;
}
}
当我在 getResult() 方法中打印列表的日志值时,它工作正常。但是从方法中出来后,列表是空的。
您已经有一个全球级别的列表,无需创建新列表。我已经更新了你的代码尝试 运行 它并测试它希望它能工作。
public class TrueFragment extends Fragment {
public static List<AllPositiveModel> newsList = new ArrayList<>();
private RecyclerView recyclerView;
private NewsAdapterTrue adapter;
private OnFragmentInteractionListener mListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_true, container, false);
recyclerView = rootView.findViewById(R.id.recycler_view_true);
getResult();// Call this method
adapter = new NewsAdapterTrue(newsList, getActivity());
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
return rootView;
}
public void getResult(){
// final List<AllPositiveModel> items = new ArrayList<>(); no need for this as you have a list on global level
GETAll getApiService;
getApiService = ApiUtils.getAPIServiceFetchAll();
getApiService.getAllNews().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) {
if (response.body() != null) {
Log.i("onSuccess", response.body());
String jsonresponse = response.body();
try {
//getting the whole json object from the response
JSONObject obj = new JSONObject(response.body());
JSONArray dataArray = obj.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
String title, desc, link, date, img, paper;
final Integer id, positive, negative;
JSONObject dataobj = dataArray.getJSONObject(i);
AllPositiveModel item = new AllPositiveModel(dataobj.getInt("id"), dataobj.getString("title"),
dataobj.getString("description"), dataobj.getString("link"),
dataobj.getString("date"), dataobj.getString("image"),
dataobj.getInt("positive_votes"), dataobj.getInt("negative_votes"),
dataobj.getString("paper"));
id = dataobj.getInt("id");
title = dataobj.getString("title");
desc = dataobj.getString("description");
link = dataobj.getString("link");
date = dataobj.getString("date");
img = dataobj.getString("image");
positive = dataobj.getInt("positive_votes");
negative = dataobj.getInt("negative_votes");
paper = dataobj.getString("paper");
newsList.add(item);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.i("onEmptyResponse", "Returned empty response");
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
// return items;
}
}
尝试this.I修改代码。
public class TrueFragment extends Fragment {
public static List<AllPositiveModel> newsList; //changed here
private RecyclerView recyclerView;
private NewsAdapterTrue adapter;
private OnFragmentInteractionListener mListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_true, container, false);
recyclerView = rootView.findViewById(R.id.recycler_view_true);
newsList = getResult(); //no changes here
adapter = new NewsAdapterTrue(newsList, getActivity());
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
return rootView;
}
public List<AllPositiveModel> getResult(){
final List<AllPositiveModel> items = new ArrayList<>();
GETAll getApiService;
getApiService = ApiUtils.getAPIServiceFetchAll();
getApiService.getAllNews().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) {
if (response.body() != null) {
Log.i("onSuccess", response.body());
String jsonresponse = response.body();
try {
//getting the whole json object from the response
JSONObject obj = new JSONObject(response.body());
JSONArray dataArray = obj.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
String title, desc, link, date, img, paper;
final Integer id, positive, negative;
JSONObject dataobj = dataArray.getJSONObject(i);
AllPositiveModel item = new AllPositiveModel(dataobj.getInt("id"), dataobj.getString("title"),
dataobj.getString("description"), dataobj.getString("link"),
dataobj.getString("date"), dataobj.getString("image"),
dataobj.getInt("positive_votes"), dataobj.getInt("negative_votes"),
dataobj.getString("paper"));
id = dataobj.getInt("id");
title = dataobj.getString("title");
desc = dataobj.getString("description");
link = dataobj.getString("link");
date = dataobj.getString("date");
img = dataobj.getString("image");
positive = dataobj.getInt("positive_votes");
negative = dataobj.getInt("negative_votes");
paper = dataobj.getString("paper");
items.add(item);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.i("onEmptyResponse", "Returned empty response");
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
return items;
}
}
我已经成功解决了问题:
我已经在方法 getResult()
中初始化了适配器和 recyclerview
adapter = new NewsAdapterTrue(TrueNewsList, getActivity());
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
但我仍然很困惑,为什么我的列表在填充后会从内存中删除。我有几乎相同的片段,并且工作得很好。希望有人回答我。
我正在用 ArrayList 填充 RecyclerView 的适配器。列表包含模型对象 class,它保存来自服务器的数据。并且需要加载到Tab Fragment中。
我已经尝试了我所知道的关于列表生命周期的一切,似乎这个列表在那个周期的某个时刻从内存中删除了。 这是代码的相关部分:
public class TrueFragment extends Fragment {
public static List<AllPositiveModel> newsList = new ArrayList<>();
private RecyclerView recyclerView;
private NewsAdapterTrue adapter;
private OnFragmentInteractionListener mListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_true, container, false);
recyclerView = rootView.findViewById(R.id.recycler_view_true);
newsList = getResult();
adapter = new NewsAdapterTrue(newsList, getActivity());
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
return rootView;
}
public List<AllPositiveModel> getResult(){
final List<AllPositiveModel> items = new ArrayList<>();
GETAll getApiService;
getApiService = ApiUtils.getAPIServiceFetchAll();
getApiService.getAllNews().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) {
if (response.body() != null) {
Log.i("onSuccess", response.body());
String jsonresponse = response.body();
try {
//getting the whole json object from the response
JSONObject obj = new JSONObject(response.body());
JSONArray dataArray = obj.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
String title, desc, link, date, img, paper;
final Integer id, positive, negative;
JSONObject dataobj = dataArray.getJSONObject(i);
AllPositiveModel item = new AllPositiveModel(dataobj.getInt("id"), dataobj.getString("title"),
dataobj.getString("description"), dataobj.getString("link"),
dataobj.getString("date"), dataobj.getString("image"),
dataobj.getInt("positive_votes"), dataobj.getInt("negative_votes"),
dataobj.getString("paper"));
id = dataobj.getInt("id");
title = dataobj.getString("title");
desc = dataobj.getString("description");
link = dataobj.getString("link");
date = dataobj.getString("date");
img = dataobj.getString("image");
positive = dataobj.getInt("positive_votes");
negative = dataobj.getInt("negative_votes");
paper = dataobj.getString("paper");
items.add(item);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.i("onEmptyResponse", "Returned empty response");
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
return items;
}
}
当我在 getResult() 方法中打印列表的日志值时,它工作正常。但是从方法中出来后,列表是空的。
您已经有一个全球级别的列表,无需创建新列表。我已经更新了你的代码尝试 运行 它并测试它希望它能工作。
public class TrueFragment extends Fragment {
public static List<AllPositiveModel> newsList = new ArrayList<>();
private RecyclerView recyclerView;
private NewsAdapterTrue adapter;
private OnFragmentInteractionListener mListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_true, container, false);
recyclerView = rootView.findViewById(R.id.recycler_view_true);
getResult();// Call this method
adapter = new NewsAdapterTrue(newsList, getActivity());
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
return rootView;
}
public void getResult(){
// final List<AllPositiveModel> items = new ArrayList<>(); no need for this as you have a list on global level
GETAll getApiService;
getApiService = ApiUtils.getAPIServiceFetchAll();
getApiService.getAllNews().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) {
if (response.body() != null) {
Log.i("onSuccess", response.body());
String jsonresponse = response.body();
try {
//getting the whole json object from the response
JSONObject obj = new JSONObject(response.body());
JSONArray dataArray = obj.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
String title, desc, link, date, img, paper;
final Integer id, positive, negative;
JSONObject dataobj = dataArray.getJSONObject(i);
AllPositiveModel item = new AllPositiveModel(dataobj.getInt("id"), dataobj.getString("title"),
dataobj.getString("description"), dataobj.getString("link"),
dataobj.getString("date"), dataobj.getString("image"),
dataobj.getInt("positive_votes"), dataobj.getInt("negative_votes"),
dataobj.getString("paper"));
id = dataobj.getInt("id");
title = dataobj.getString("title");
desc = dataobj.getString("description");
link = dataobj.getString("link");
date = dataobj.getString("date");
img = dataobj.getString("image");
positive = dataobj.getInt("positive_votes");
negative = dataobj.getInt("negative_votes");
paper = dataobj.getString("paper");
newsList.add(item);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.i("onEmptyResponse", "Returned empty response");
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
// return items;
}
}
尝试this.I修改代码。
public class TrueFragment extends Fragment {
public static List<AllPositiveModel> newsList; //changed here
private RecyclerView recyclerView;
private NewsAdapterTrue adapter;
private OnFragmentInteractionListener mListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_true, container, false);
recyclerView = rootView.findViewById(R.id.recycler_view_true);
newsList = getResult(); //no changes here
adapter = new NewsAdapterTrue(newsList, getActivity());
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
return rootView;
}
public List<AllPositiveModel> getResult(){
final List<AllPositiveModel> items = new ArrayList<>();
GETAll getApiService;
getApiService = ApiUtils.getAPIServiceFetchAll();
getApiService.getAllNews().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) {
if (response.body() != null) {
Log.i("onSuccess", response.body());
String jsonresponse = response.body();
try {
//getting the whole json object from the response
JSONObject obj = new JSONObject(response.body());
JSONArray dataArray = obj.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
String title, desc, link, date, img, paper;
final Integer id, positive, negative;
JSONObject dataobj = dataArray.getJSONObject(i);
AllPositiveModel item = new AllPositiveModel(dataobj.getInt("id"), dataobj.getString("title"),
dataobj.getString("description"), dataobj.getString("link"),
dataobj.getString("date"), dataobj.getString("image"),
dataobj.getInt("positive_votes"), dataobj.getInt("negative_votes"),
dataobj.getString("paper"));
id = dataobj.getInt("id");
title = dataobj.getString("title");
desc = dataobj.getString("description");
link = dataobj.getString("link");
date = dataobj.getString("date");
img = dataobj.getString("image");
positive = dataobj.getInt("positive_votes");
negative = dataobj.getInt("negative_votes");
paper = dataobj.getString("paper");
items.add(item);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.i("onEmptyResponse", "Returned empty response");
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
return items;
}
}
我已经成功解决了问题: 我已经在方法 getResult()
中初始化了适配器和 recyclerviewadapter = new NewsAdapterTrue(TrueNewsList, getActivity());
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
但我仍然很困惑,为什么我的列表在填充后会从内存中删除。我有几乎相同的片段,并且工作得很好。希望有人回答我。