Question

J'ai développé une application qui remplit une liste.Cela fonctionne bien dans la façon dont je l'ai fait mais je ne suis pas convoqué que j'ai résolu le problème de manière recommandée.J'ai lu que vous devriez remplacer l'onactivitivité dans un fragment et remplir la liste là-bas au lieu de le faire dans OnCreateView.OncreAreView ne devrait être utilisé que pour gonfler des vues statiques.Est-ce vrai?Si oui, comment ces deux méthodes devraient-elles ressembler à la fin?

Ceci est ma classe de fragment:

public class FragmentMain extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_main, container, false);

    List<MyItem> items = createListItems();
    ListView listView = (ListView) view.findViewById(R.id.list);
    MyListAdapter adapter = new MyListAdapter(view.getContext(), items);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Toast.makeText(view.getContext(),
                    "Clicked " + position, Toast.LENGTH_LONG)
                    .show();

        }
    });

    return view;
  }
.
.
.
}

My MainActivity ajoute simplement le fragment:

public class MainActivity extends Activity {

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

        FragmentMain fm = new FragmentMain();
        getFragmentManager().beginTransaction()
                .add(R.id.fragment_main_container, fm).commit();

    }
.
.
.
}

Était-ce utile?

La solution

C'est vrai à une certaine étendue uniquement parce que OnCreateView se produit sur le fil de l'interface utilisateur et vous ne voulez rien de ralentir cela, sinon votre interface utilisateur sera lente et agitée.Par exemple, dans votre classe de fragments, vous avez un appel à une méthode "Createlistitems ()".Je ne sais pas combien d'articles que vous faites, mais si c'est beaucoup, cela pourrait ralentir votre UI (surtout si vous accédez à une base de données et à interrogez des objets, etc.).Donc, vous pourriez le faire dans l'onactivitéCreated, mais vous pouvez également utiliser un massif d'asyncaptage.Donc, votre code deviendrait quelque chose comme ceci:

public class LoadListObjectsTask extend AsyncTask<Void, List<MyItem>, Void> {

  private MyListAdapter myListAdapter;
  private Context mContext;

  public LoadListObjectsTask(Context context) {
     this.mContext = context;
  } 


  @Override 
   public void doInBackground(Void...params) {
     //create your list objects here instead of on UI thread. This will run on a separate thread.
   myListAdapter = new MyListAdapter(mContext, items);
   return items; //return list of MyItems
   }


   //This is called when doInBackground is done. THIS WILL RUN ON THE UI THREAD So don't do 
   //anything slow here
   @Override 
   public void onPostExecute(List<MyItem>...params //don't really need the list here//) {
     listView.setAdapter(myListAdapter);
   }
}

Puis dans votre fragment

public class FragmentMain extends Fragment {

private ListView listView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_main, container, false);

    List<MyItem> items = new ArrayList<MyItem>();
    listView = (ListView) view.findViewById(R.id.list);

   //new code
    new LoadListObjectsTask(getActivity()).execute();

    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Toast.makeText(view.getContext(),
                    "Clicked " + position, Toast.LENGTH_LONG)
                    .show();

        }
    });

    return view;
  }

 public void onResume()... {
  //also add the task here so your content is reloaded on resume..
  new LoadListObjectsTask(getActivity()).execute();
 }
.
.
.
}

Si vous ne voulez pas faire cela, faites simplement votre liste de myitems un champ privé et déplacez

List<MyItem> items = createListItems();

sur OnActivityCréé ().

espère que cela aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top