在适配器中添加 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);

但我仍然很困惑,为什么我的列表在填充后会从内存中删除。我有几乎相同的片段,并且工作得很好。希望有人回答我。