1

フラグメント内に Listview があります。私が直面している問題は、別のフラグメントに切り替えるたびにリストが空になり、再度ロードする必要があることです。

Instagramで行うのと同じように、リストのインスタンスを保存するにはどうすればよいですか(同じリストアイテムで、残したとおりのリストを取得します)。

フラグメントのコード:

public class ListActivity extends ListFragment {

    public void ToastLoadShout(String msg) {
        Toast.makeText(getActivity(), msg.toString(), Toast.LENGTH_LONG).show();
    }
    private static View View;

    HttpClient client;
    HttpPost httppost;
    HttpGet httpget;
    JSONObject json;
    List<List<String>> items;
    List<item> markers = new ArrayList<item>();

    MobileArrayAdapter adapter;

    ListView list;
    ProgressBar listload;
    Button relist;

    Preferences pref;

    String datadata = "";

    String savedlat="0.0";
    String savedlon="0.0";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (View != null) {
            ViewGroup parent = (ViewGroup) View.getParent();
            if (parent != null)
                parent.removeView(View);
        }
        View = inflater.inflate(R.layout.activity_list, container, false);

        return View;
    }

    @Override
    public void onStart() {
        super.onStart();

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        try {
            pref = new Preferences(getActivity());
            list = (ListView) getView().findViewById(android.R.id.list);
            listload = (ProgressBar) getView().findViewById(R.id.listload);
            HashMap<String, String> loc = pref.getData();
            ToastLoadShout(loc.get(Preferences.LAT) + ","
                    + loc.get(Preferences.LON));
            if (loc.get(Preferences.LAT) != "0.0" && loc.get(Preferences.LAT) != null)
            {
                //adapter.deleteList();
                //list.destroyDrawingCache();
                if (loc.get(Preferences.LAT) != savedlat && loc.get(Preferences.LON)!=savedlon){
                new Load().execute();
                savedlat=loc.get(Preferences.LAT);
                savedlon=loc.get(Preferences.LON);
                }
            }
            else
                ToastLoadShout("Get Location First.");

            relist = (Button) getView().findViewById(R.id.relist);
            relist.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    listload.setVisibility(View.INVISIBLE);
//                  if (adapter!=null){
//                      list.destroyDrawingCache();
//                      new Load().execute();
//                      adapter.deleteList();
//                      
//                  }
                    HashMap<String, String> loc = pref.getData();
                    ToastLoadShout(loc.get(Preferences.LAT) + ","
                            + loc.get(Preferences.LON));
                    if (loc.get(Preferences.LAT) != "0.0"
                            && loc.get(Preferences.LAT) != null){
                        adapter.deleteList();
                        list.destroyDrawingCache();
                        new Load().execute();}
                    else
                        ToastLoadShout("Get Location First.");
                }});

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {

        // get selected items
        //String selectedValue = (String) getListAdapter().getItem(position);
        String selectedValue = markers.get(position).getTitle();
        Toast.makeText(getActivity(), selectedValue, Toast.LENGTH_SHORT).show();

    }
}

ご協力ありがとうございます。

編集

これをコードに追加しました:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true); 
    }

しかし、それは役に立ちませんでした。

編集#2:

私のコードは今そのように見えますが、動作しません:

public class ListActivity extends ListFragment {

    public void ToastLoadShout(String msg) {
        Toast.makeText(getActivity(), msg.toString(), Toast.LENGTH_LONG).show();
    }
    private static View View;

    HttpClient client;
    HttpPost httppost;
    HttpGet httpget;
    JSONObject json;
    List<List<String>> items;
    List<item> markers = new ArrayList<item>();

    MobileArrayAdapter adapter;

    ListView list;
    ProgressBar listload;
    Button relist;

    Preferences pref;

    String datadata = "";

    String savedlat="0.0";
    String savedlon="0.0";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.activity_list, container, false);
    }


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

        try {
            pref = new Preferences(getActivity());
            list = (ListView) getView().findViewById(android.R.id.list);
            listload = (ProgressBar) getView().findViewById(R.id.listload);
            HashMap<String, String> loc = pref.getData();
            ToastLoadShout(loc.get(Preferences.LAT) + ","
                    + loc.get(Preferences.LON));
            if (loc.get(Preferences.LAT) != "0.0" && loc.get(Preferences.LAT) != null)
            {
                //adapter.deleteList();
                //list.destroyDrawingCache();
                if (loc.get(Preferences.LAT) != savedlat && loc.get(Preferences.LON)!=savedlon){
                new Load().execute();
                savedlat=loc.get(Preferences.LAT);
                savedlon=loc.get(Preferences.LON);
                }
            }
            else
                ToastLoadShout("Get Location First.");

            relist = (Button) getView().findViewById(R.id.relist);
            relist.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    listload.setVisibility(View.INVISIBLE);
//                  if (adapter!=null){
//                      list.destroyDrawingCache();
//                      new Load().execute();
//                      adapter.deleteList();
//                      
//                  }
                    HashMap<String, String> loc = pref.getData();
                    ToastLoadShout(loc.get(Preferences.LAT) + ","
                            + loc.get(Preferences.LON));
                    if (loc.get(Preferences.LAT) != "0.0"
                            && loc.get(Preferences.LAT) != null){
                        adapter.deleteList();
                        list.destroyDrawingCache();
                        new Load().execute();}
                    else
                        ToastLoadShout("Get Location First.");
                }});

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setRetainInstance(true); 

    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {

        // get selected items
        //String selectedValue = (String) getListAdapter().getItem(position);
        String selectedValue = markers.get(position).getTitle();
        Toast.makeText(getActivity(), selectedValue, Toast.LENGTH_SHORT).show();

    }

}

編集#3:

フラグメントのメイン (ホスト) アクティビティ:

public class Fragments extends FragmentActivity {

    Fragment newFragment;
    Button Add;
    public void ToastLoadShout(String msg) {

        Toast.makeText(this, msg.toString(), Toast.LENGTH_SHORT).show();
    }

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

        //Set Custom actionBar<
        getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        getActionBar().setCustomView(R.layout.titlebar);
        getActionBar().setHomeButtonEnabled(true);
        getActionBar().setDisplayHomeAsUpEnabled(true);
        //Set Custom actionBar>

        ListActivity fragment = new ListActivity();
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();
        transaction.add(R.id.fragment_place, fragment,"Nearby");
        transaction.commit();

        turnGPSOn();

         Add = (Button)findViewById(R.id.add);
         Add.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
         Intent Intent = new Intent(Fragments.this,Add.class);
         Bundle bndlanimation =
         ActivityOptions.makeCustomAnimation(getApplicationContext(),
         R.anim.animation,R.anim.animation2).toBundle();
         startActivity(Intent, bndlanimation);
         }
         });

         /* For putting commas in attractin's checkIns
         String number = "1345";
         int amount = Integer.parseInt(number);
         DecimalFormat formatter = new DecimalFormat("#,###");
         ToastLoadShout(formatter.format(amount));*/
    }

    public void onSelectFragment(View view) {

        String fragTag="";
        boolean needNew=false;


         if (view == findViewById(R.id.map)) 
            {
            Fragment f = getSupportFragmentManager().findFragmentByTag("Map");
            if (f==null){
                newFragment = new MainActivity();
                needNew=true;
                fragTag="Map";
            }

            else{
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.fragment_place, f, "Map"); //or whatever other string you want to use
            transaction.addToBackStack(null);
            transaction.commit();
            }
        }

         else if (view == findViewById(R.id.nearby)) 
            {
            Fragment f = getSupportFragmentManager().findFragmentByTag("Nearby");
            if (f==null){
                newFragment = new ListActivity();
                needNew=true;
                fragTag="Nearby";
            }

            else{
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.fragment_place, f, "Nearby"); //or whatever other string you want to use
            transaction.addToBackStack(null);
            transaction.commit();
            }
        }

//      else 
//      {
//          newFragment = new ListActivity();
//      }

        if (needNew) {
            FragmentTransaction transaction = getSupportFragmentManager()
                    .beginTransaction();
            transaction.replace(R.id.fragment_place, newFragment, fragTag);
            transaction.addToBackStack(null);
            transaction.commit();
        }
    }
}
4

1 に答える 1

1

setRetainInstance(boolean preserve) (
構成変更などによる) アクティビティの再作成後もフラグメント インスタンスを保持するかどうかを制御します。

setRetainInstance(true)フラグメントの場合onCreate(Bundle)、フラグメントは再作成されていないため、呼び出されません。したがって、でデータを取得し、メソッドonCreate(Bundle)でビューに設定できます。onCreateView(LayoutInflater, ViewGroup, Bundle)

ドキュメントを見る

編集:また、この部分が本当に必要ですか:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if (View != null) {
        ViewGroup parent = (ViewGroup) View.getParent();
        if (parent != null)
            parent.removeView(View);
    }
    View = inflater.inflate(R.layout.activity_list, container, false);

    return View;
}

次のようにする必要があります。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.activity_list, container, false);
}
于 2013-11-13T20:03:04.053 に答える