0

私は1つのアクティビティ、listViewを含むフラグメント、および各listViewアイテムの詳細を含むフラグメントを持っています。API からフラグメント データを取得しています。listViewに戻ったときに復元できるようにするには、ロードされた日付とlistViewの位置を正しく保存するにはどうすればよいですか? このソリューションを実装しようとしましたが、フラグメントのインスタンス状態をバックスタックに正しく保存するにはどうすればよいですか? しかし、listView を正しく復元できません。

私のメインアクティビティ

    @Override
    protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        //Set the fragment initially
        listFragment = new ListFragment();
        fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, listFragment);
        fragmentTransaction.commit();

        if (savedInstanceState != null) {
            //Restore the fragment's instance
            listFragment = (ListFragment)getSupportFragmentManager().getFragment(savedInstanceState, "listContent");
        }
...

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //Save the fragment's instance
        getSupportFragmentManager().putFragment(outState, "listContent", listFragment);
    }

およびListFragment

public class ListFragment extends Fragment {

    public static final String REQUEST_TAG = "ProjectListFragment";

    private int page;
    private View view;
    private RelativeLayout loading ;
    private PagingListView listView;
    private PagingProjectListAdapter adapter;
    private ArrayList<String> projects = new ArrayList<>();
    private ArrayList<String> loadedProjects = new ArrayList<>();

    public ListFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view =  inflater.inflate(R.layout.fragment_list, container, false);

        listView = (PagingListView) view.findViewById(R.id.projectsListView);
        loading = (RelativeLayout) view.findViewById(R.id.loading);
        //page = 1;
        adapter = new PagingProjectListAdapter(getContext(), ListFragment.this);
        listView.setAdapter(adapter);
        listView.setHasMoreItems(true);

        // Inflate the layout for this fragment
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
            // FIXME not used
            listView.onFinishLoading(true, projects);
            //Restore the fragment's state here
        } else {
            projects.clear();
            page = 1;

            listView.setPagingableListener(new PagingListView.Pagingable() {
                @Override
                public void onLoadMoreItems() {
                    new CustomVolleyAsyncTask().execute();
                }
            });
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("currentPosition", 0);
        //Save the fragment's state here
    }

    public void itemClickMethod(View detailsView) {
        LinearLayout linearLayout = (LinearLayout) detailsView;
        String bid = linearLayout.getContentDescription().toString();

        Bundle bundle = new Bundle();
        String k = "ProjectID";
        bundle.putString(k, bid);

        DetailsFragment detailsFragment = new DetailsFragment();
        detailsFragment.setArguments(bundle);

        final FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.fragment_container, detailsFragment, "DetailsFragmentTag");
        ft.addToBackStack(null);
        ft.commit();
    }

    private class CustomVolleyAsyncTask extends SafeAsyncTask<List<String>> implements Response.Listener,
            Response.ErrorListener {

        public List<String> status = null;
        private RequestQueue mQueue;

        @Override
        public List<String> call() throws Exception {
            mQueue = CustomVolleyRequestQueue.getInstance(view.getContext())
                    .getRequestQueue();
            String url = "http://www.myapi.com/api/v1/data/" + Integer.toString(page);
            final CustomJSONObjectRequest jsonRequest = new CustomJSONObjectRequest(Request.Method
                    .GET, url,
                    new JSONObject(), this, this);
            jsonRequest.setTag(REQUEST_TAG);
            mQueue.add(jsonRequest);
            // TODO rm redundant result
            return status;
        }

        @Override
        public void onErrorResponse(VolleyError error) {
            // FIXME check no response case crash
            //mTextView.setText(error.getMessage());
        }

        @Override
        public void onResponse(Object response) {
            try {
                JSONArray projectsJSON = new JSONArray(((JSONObject) response).getString("projects"));
                loadedProjects.clear();
                for (int i=0; i < projectsJSON.length(); i++) {
                    loadedProjects.add(projectsJSON.getJSONObject(i).toString());
                }
                page++;

                listView.onFinishLoading(true, loadedProjects);
                if (loading.getVisibility() == View.VISIBLE && !listView.isLoading()){
                    listView.setVisibility(View.VISIBLE);
                    loading.setVisibility(View.GONE);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }}}
}

現在、savedInstanceState は常に null ですが、何が欠けていますか?

4

1 に答える 1

0

構成が変更されたときに、フラグメントが2回作成されたと思います。ここでスタファンは、なぜこれが起こったのかを説明します。この方法で同様の問題を解決します(アクティビティonCreateで):

        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag(TAG);
        if(fragment==null)
            fragmentManager.beginTransaction()
                    .add(R.id.container, NewsFragment.newInstance(),TAG)
                    .commit();
于 2016-09-20T01:08:24.800 に答える