Domanda

Ho sviluppato un'app che riempie una lista.Funziona bene nel modo in cui l'ho fatto, ma non sono convocato che ho risolto il problema in un modo consigliato.Ho letto che dovresti sovrascrivere la omatica.Oncreateview dovrebbe essere utilizzato solo per gonfiare le viste statiche.È vero?Se sì, come dovrebbero sembrare questi due metodi alla fine?

Questa è la mia classe di frammento:

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;
  }
.
.
.
}
.

La mia mainattività aggiunge il frammento:

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();

    }
.
.
.
}
.

È stato utile?

Soluzione

È vero per un certo estendere solo perché OnCreateView avviene sulla discussione dell'interfaccia utente e non vuoi nulla di rallentare questo altrimenti il tuo UI sarà lento e mosso.Ad esempio, nella tua classe di frammenti hai una chiamata a un metodo "CreateListiTems ()".Non so quanti articoli che stai facendo, ma se è molto potrebbe rallentare il tuo interfaccia utente (specialmente se stai accedendo a un database e agli oggetti di interrogazione e così via).Quindi potresti farlo in OntactityCreated ma potresti anche usare un asynctask.Quindi il tuo codice diventerebbe qualcosa del genere:

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);
   }
}
.

Allora nel tuo frammento

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();
 }
.
.
.
}
.

Se non vuoi farlo, crea la tua lista di myitems un campo privato e muovi

List<MyItem> items = createListItems();
.

A OntactivityCreated ().

Spero che ti aiuti!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top