【发布时间】:2018-05-07 11:19:30
【问题描述】:
我正在创建一个具有底部导航的应用程序,并且我正在使用 api 检索数据。我正在调用 api 并将值分配给 fragment 中的 listview 在 oncreateview 方法中。但问题是每次都会执行此方法,并且每次调用片段时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