【问题标题】:fragment data loads everytime fragment is called每次调用片段时都会加载片段数据
【发布时间】:2018-05-07 11:19:30
【问题描述】:

我正在创建一个具有底部导航的应用程序,并且我正在使用 api 检索数据。我正在调用 api 并将值分配给 fragment 中的 listviewoncreateview 方法中。但问题是每次都会执行此方法,并且每次调用片段时api都会检索数据。我想要的是数据应该只在第一次调用片段时加载一次,而每隔一次列表视图应该只显示以前加载的数据,我不知道该怎么做,如果你知道其他方法,请帮忙。

这就是我调用片段的方式

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        android.app.FragmentManager manager = getFragmentManager();
        switch (item.getItemId()) {
            case R.id.navigation_schedule:
                Fragment scheduleFragment = new ScheduleFragment();
                    manager.beginTransaction().replace(R.id.main, scheduleFragment).commit();
                return true;
            case R.id.navigation_teams:
                Fragment teamFragment = new TeamFragment();
                manager.beginTransaction().replace(R.id.main, teamFragment).commit();
                return true;
            case R.id.navigation_champions:
                Fragment championsFragment = new ChampionsFragment();
                manager.beginTransaction().replace(R.id.main, championsFragment).commit();
                return true;
            case R.id.navigation_live:
                Fragment liveFragment = new LiveFragment();
                manager.beginTransaction().replace(R.id.main, liveFragment).commit();
                return true;
            case R.id.navigation_records:
                Fragment recordsFragment = new RecordsFragment();
                manager.beginTransaction().replace(R.id.main, recordsFragment).commit();
                return true;
        }
        return false;
    }
};

这就是在片段中加载数据的方式

public class ScheduleFragment extends Fragment {

private ListView lvSchedule;

customAdapterSchedule adapterSchedule;
List<BeanSchedule> listSchedule = new ArrayList<>();
float x1, x2, y1, y2;

private static final String url = "https://wc19.000webhostapp.com/ad/class/api.php?method=schedule";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


}

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_schedule, null);

    lvSchedule = (ListView)view.findViewById(R.id.lvSchedule);





        adapterSchedule = new customAdapterSchedule(this.getContext(), listSchedule);
        lvSchedule.setAdapter(adapterSchedule);
        apiCall();

    return view;
}

public void apiCall(){
    JsonArrayRequest scheduleReq = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {

                    for (int i = 0; i < response.length(); i++) {
                        try {
                            JSONObject obj = response.getJSONObject(i);
                            BeanSchedule schedule = new BeanSchedule();

                           schedule.setTeam1name(obj.getString("team1name"));
                            schedule.setTeam2name(obj.getString("team2name"));
                            schedule.setTeam2img(obj.getString("team2img"));
                            schedule.setTeam1img(obj.getString("team1img"));
                            schedule.setDate(obj.getString("date"));
                            if(obj.getString("daynight").equals("0"))
                                schedule.setDaynight(" ");
                            else
                                schedule.setDaynight("Day/Night");

                            // Genre is json array


                            // adding movie to movies array
                            listSchedule.add(schedule);

                        } catch (JSONException e) {
                            e.printStackTrace();
                          //  Toast.makeText(getActivity(),"inside catch",Toast.LENGTH_LONG);

                        }


                    }

                    // notifying list adapter about data changes
                    // so that it renders the list view with updated data
                    adapterSchedule.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {


        }
    });

    AppController.getInstance().addToRequestQueue(scheduleReq);

}

}

【问题讨论】:

  • 提供您的代码。片段在 Activity 和事务中是如何排列的。
  • 一些代码会更好
  • 您需要将数据保存在本地存储(sqlite)中。并从 sqlite 开始调用它。

标签: android listview android-fragments bottomnavigationview


【解决方案1】:

是什么阻止您在最初收到数据后设置标志?我不知道你的代码是什么样的,你的问题也不是很详细,但是这样的事情应该可以工作:

boolean data_loaded_once = false;

在您的 API 回调函数中:

if(!data_loaded_once){
    data_loaded_once = true;
    // load data here
}

话虽如此,您可能根本不应该遇到这个问题。

编辑:将数据保存在其他地方:ListView 适配器(临时)或 SQLite。

【讨论】:

  • 每次设置flag并再次调用fragment时都会创建fragment的view,数据不会被加载,listview为空,fragment中什么都不会显示跨度>
  • 就像其他人已经提到的那样,如果您不向我们展示代码,我们将无法进一步帮助您:(
  • @PriteshThaker 您应该在 ListView 适配器中设置标志(并因此将数据保存在那里)而不是在片段中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多