2014-10-28 9 views
11

Ho un'attività principale che contiene la barra delle azioni con 3 pulsanti di menu.Android aggiorna un elenco di frammenti dall'attività padre

Ho quindi un frammento all'interno di questa attività principale che ha una lista.

Vorrei essere in grado di aggiornare l'elenco nel frammento dall'attività principale, quando si fa clic su uno dei pulsanti del menu, o preferibilmente appena rimosso tutte le righe dall'elenco.

Qualsiasi aiuto è apprezzato.

Grazie.

public class Favourite extends SherlockFragmentActivity { 

    ActionBar actionBar; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.favourite); 

     actionBar = getSupportActionBar(); 

     actionBar.setDisplayShowTitleEnabled(false); 

     BitmapDrawable bg = (BitmapDrawable)getResources().getDrawable(R.drawable.actionbar_bg); 
     bg.setTileModeX(TileMode.REPEAT); 
     getSupportActionBar().setBackgroundDrawable(bg); 

     getSupportActionBar().setIcon(R.drawable.favourite_title); 

     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     ActionBar.Tab tabAll = actionBar.newTab(); 
     ActionBar.Tab tabfavs = actionBar.newTab(); 
     ActionBar.Tab tabhist = actionBar.newTab(); 
     tabAll.setText("all"); 
     tabfavs.setText("favs"); 
     tabhist.setText("hist"); 
     tabAll.setTabListener(new MyTabListener()); 
     tabfavs.setTabListener(new MyTabListener()); 
     tabhist.setTabListener(new MyTabListener()); 
     actionBar.addTab(tabAll); 
     actionBar.addTab(tabfavs); 
     actionBar.addTab(tabhist); 


     try{ 

     } 
     catch(Exception e) 
     { 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.actionbar_itemlist_favourite, menu); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch(item.getItemId()) { 
       case R.id.history: 
        break; 
       case R.id.favourite: 
        Intent favAct = new Intent(this, Favourite.class); 
        startActivity(favAct); 
        break; 
       case R.id.delete: 
        ///I WANT TO BE ABLE TO REFRESH FRAGMENTLIST FROM HERE 
       } 
       return true; 
    } 

    } 

class MyTabListener implements ActionBar.TabListener { 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     if(tab.getPosition()==0) 
     { 
      FavouriteAllWords frag = new FavouriteAllWords(); 
      ft.replace(android.R.id.content, frag); 

     } 
     else if(tab.getPosition()==1) 
     { 
      FavouriteFavWords frag = new FavouriteFavWords(); 
      ft.replace(android.R.id.content, frag); 

     } 
     else if(tab.getPosition()==2) 
     { 
      FavouriteHistWords frag = new FavouriteHistWords(); 
      ft.replace(android.R.id.content, frag); 
     } 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 

} 

//////////////////// MIA LISTA FRAMMENTO DI CLASSE

public class FavouriteAllWords extends ListFragment { 

    ArrayAdapter<String> adapter; 

    List<String> stringOfFavWords; 

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

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) 
    { 
     adapter = new ArrayAdapter<String>( 
       inflater.getContext(), R.layout.row, stringOfFavWords); 
       setListAdapter(adapter); 

     return super.onCreateView(inflater, group, saved); 
    } 

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

} 
+0

Ti preghiamo di mostrare un po 'di codice, quello che hai fatto?e quale pulsante hai aggiunto nella barra delle azioni –

+0

La risposta di Biraj Zalavadia è un pessimo approccio progettuale. Vedi il mio commento sulla sua risposta. – Squonk

risposta

20

si può facilmente raggiungere questo obiettivo usando l'interfaccia

MainActivity.java

public class MainActivity extends Activity { 

    public FragmentRefreshListener getFragmentRefreshListener() { 
     return fragmentRefreshListener; 
    } 

    public void setFragmentRefreshListener(FragmentRefreshListener fragmentRefreshListener) { 
     this.fragmentRefreshListener = fragmentRefreshListener; 
    } 

    private FragmentRefreshListener fragmentRefreshListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     Button b = (Button)findViewById(R.id.btnRefreshFragment); 

     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(getFragmentRefreshListener()!=null){ 
        getFragmentRefreshListener().onRefresh(); 
       } 
      } 
     }); 


    } 


    public interface FragmentRefreshListener{ 
     void onRefresh(); 
    } 

} 

MyFragment.java

public class MyFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = null; // some view 

     /// Your Code 


     ((MainActivity)getActivity()).setFragmentRefreshListener(new MainActivity.FragmentRefreshListener() { 
      @Override 
      public void onRefresh() { 

       // Refresh Your Fragment 
      } 
     }); 


     return v; 
    } 
} 
+1

Grazie, questo ha fatto il trucco. – user1319668

+1

Questo è completamente il modo sbagliato di fare le cose. Un 'frammento' dovrebbe * MAI * 'sapere' su quale tipo di 'Attività' è collegato a. In particolare, se un 'Fragment' deve essere autonomo e riusabile, come può esserci una garanzia che 'Activity' abbia definito una particolare interfaccia? Risposta breve - non può – Squonk

+2

@ Squonk Non farti prendere dal panico, amico. Leggi attentamente la domanda. Aveva chiaramente scritto che voglio aggiornare il frammento da MainActivity.java. Non ha detto che il suo frammento è generale. Quindi la risposta che invio è relativa alla domanda non per scopi generici. Se hai un approccio migliore, per favore pubblica una discussione. –

5
  • Basta fare l'aggiornamento/aggiornamento metodo pubblico e call dalla tua attività.

O

  • Usa LocalBroadcastManager o EventBus per inviare evento dalla tua attività, e mediante la sottoscrizione di questo evento in un frammento - reagiscono ad esso e chiamare il metodo di aggiornamento/aggiornamento.
+0

Il 'Fragment' non ha bisogno di essere una classe interna di' Activity' per poter utilizzare un metodo pubblico. Finché "Attività" ha un riferimento all'istanza "Frammento", può chiamare qualsiasi metodo pubblico nel "Frammento". – Squonk

+0

Giusto! Il mio male ... – localhost

0

Quando si fa clic su ActionBar su qualsiasi pulsante, chiamare l'interfaccia per aggiornare ListFragment. Perché nell'interfaccia java viene utilizzata l'inter-comunicazione.

0
risposta di

Biraj Zalavadia è al 100% a destra, si chiamerà metodi di frammento di nay dall'interfaccia .... questo metodo di interfaccia è in esecuzione senza errori ...

utilizzare questo in MainActivity sopra oncreate private FragmentRefreshListener fragmentRefreshListener;

public FragmentRefreshListener getFragmentRefreshListener() { 
    return fragmentRefreshListener; 
} 

public void setFragmentRefreshListener(
     FragmentRefreshListener fragmentRefreshListener) { 
    this.fragmentRefreshListener = fragmentRefreshListener; 
} 

all'interno di attività

private void refreshcall(String result2) { 
    // TODO Auto-generated method stub 
    if (getFragmentRefreshListener() != null) { 
     getFragmentRefreshListener().onRefresh(result2); 
    } 

} 

e mettere questo in necessario Frammento

private FragmentRefreshListener fragmentRefreshListener; 

    public FragmentRefreshListener getFragmentRefreshListener() { 
     return fragmentRefreshListener; 
    } 

    public void setFragmentRefreshListener(
      FragmentRefreshListener fragmentRefreshListener) { 
     this.fragmentRefreshListener = fragmentRefreshListener; 
    }