【问题标题】:how to recall android fragment without run again JSON?如何在不再次运行 JSON 的情况下调用 android 片段?
【发布时间】:2017-09-29 13:53:37
【问题描述】:

如果fragemnt被召回,我希望它首先调用的片段显示视图不再运行json。我再次打开片段后的代码片段再次请求json。我是 java/android 编程的初学者,但我试图添加不同的教程来创建一个定制的应用程序来做我想做的事,这对这里的大多数人来说可能很容易,但我卡住了

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
    // Creating volley request obj
    JsonArrayRequest billionaireReq = new JsonArrayRequest(getURL,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    url_maps = new HashMap<String, String>();
                    // Parsing json
                    for (int i = 0; i < response.length(); i++) {
                        try {

                            JSONObject obj = response.getJSONObject(i);
                            url_maps.put(obj.getString("title") + " - " + obj.getString("releaseYear"), obj.getString("image"));

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }

                    for (String name : url_maps.keySet()) {
                        TextSliderView textSliderView = new TextSliderView(getActivity());
                        // initialize a SliderLayout
                        textSliderView
                                .description(name)
                                .image(url_maps.get(name))
                                .setScaleType(BaseSliderView.ScaleType.CenterCrop)
                                .setOnSliderClickListener(HomeFragment.this);

                        //add your extra information
                        textSliderView.bundle(new Bundle());
                        textSliderView.getBundle().putString("extra", name);

                        mSlider.addSlider(textSliderView);
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getActivity(), "network issue: please enable wifi/mobile data", Toast.LENGTH_SHORT).show();
        }
    });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(billionaireReq);


}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_home, container, false);
    mSlider = (SliderLayout) view.findViewById(R.id.slider_home);
    gridView = (GridView) view.findViewById(R.id.grid);
    gridView.setAdapter(new CustomAndroidGridViewAdapter(getActivity(), gridViewStrings, gridViewImages));
    mSlider.setPresetTransformer(SliderLayout.Transformer.Stack);
    mSlider.setPresetIndicator(SliderLayout.PresetIndicators.Center_Top);
    mSlider.setCustomAnimation(new DescriptionAnimation());
    mSlider.setDuration(4000);
    return view;
}

【问题讨论】:

    标签: android json android-studio android-fragments android-volley


    【解决方案1】:

    “我再次打开片段后的代码片段再次请求json” 我从您的问题中得到的是,如果您过去已经访问过相同的片段,您不想再次请求 json。您可以做一件事,当您第一次访问片段时,在 saveStateInstance(Bundle bundle) 覆盖方法中将 json 对象保存到 Bundle 中,当您重新访问片段检查并从 onCreateView(LayoutInflater inflater, ViewGroup parent,捆绑 savedInstanceState) 方法。这样你就可以维护片段的状态。

    【讨论】:

    • 示例我的问题是我有 2 个带有片段的选项卡,当我打开它时第一个片段是在列表视图完成后向列表视图请求 json 我打开片段 B 然后我再次打开片段 A 它显示完整的列表视图不完整运行 json 请求并再次显示到 listview。
    • 返回片段A时是否要刷新listview?如果是,则编写刷新逻辑意味着在 onCreateView() 而不是 onCreate() 中获取 json 并将适配器设置为 listview
    • 不,我只想要列表视图。但我的代码总是再次请求。
    • 再次访问片段A时没有看到listview吗?
    • "listview is request before show" 这是什么意思,你能更清楚地解释你的疑问是什么吗?
    【解决方案2】:

    覆盖onSaveInstanceState 方法以保存您的json 实例。在您的情况下,您已将其存储在 String 变量或实现 Parcelable 接口的对象中。要保存的有效数据结构列表在这里: https://developer.android.com/reference/android/os/Bundle.html

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("yourString", yourJsonInstance);
        outState.putString("yourParcelableObj", yourParcelableObj);
        //some other variables to save state
    }
    

    你有办法恢复你的数据,你可以通过覆盖onRestoreInstanceState方法来做到这一点。或者您可以在onCreate 方法中检查savedInstanceState 是否存储您的数据:

    这在onCreate 之后运行:

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    
        // Restore data here
        yourJsonString = savedInstanceState.getString("yourString");
    }
    

    或者你可以把这个放在你的onCreate方法中:

    if (savedInstanceState != null) {
        // Restore data here
        yourJsonString = savedInstanceState.getString("yourString");
    } else{
        //else get your json normally
    }
    

    【讨论】:

    • 哦,是的,谢谢回答,但不仅仅是我保存到 savedInstanceStat 的 json。我希望片段仅在第一次使用简历时显示视图。例如,当我打开片段 A 第一次幻灯片是 1 2 3 4 5 并且我打开片段 B 时,当我返回片段 A 幻灯片继续到 6 7 8 9 而不是再次到 1。
    • 你能在最后打开幻灯片的时候保存一些变量吗?我是这样的,你可以把它保存在savedInstanceState中,如果在savedInstanceState中存在变量,则恢复这个变量并获取下一张幻灯片。
    • 不,你能给我示例代码吗?我正在使用 myinnos imagesliderwithswipeslibrary。
    • 如果是这个库github.com/myinnos/ImageSliderWithSwipes/blob/master/… 然后在你的布局中你有方法getCurrentPosition 来获取位置,获取它并保存它,然后像我上面显示的那样恢复它并使用方法setCurrentPosition设置当前位置。
    • 你能给我简单的代码来保存getCurrentPosition和Restore setCurrentPosition吗?
    【解决方案3】:

    如果您使用的是 Viewpager,那么只需添加

    pager.setOffscreenPageLimit(limit)
    

    Refer this post

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多