web-dev-qa-db-fra.com

Android actualise une liste de fragments à partir de son activité parent

J'ai une activité principale qui contient la barre d'action avec 3 boutons de menu.

J'ai ensuite un fragment dans cette activité principale qui a une liste.

J'aimerais pouvoir actualiser la liste dans le fragment de l'activité principale lorsqu'un clic est effectué sur l'un des boutons de menu ou, de préférence, simplement supprimer toutes les lignes de la liste.

Toute aide est appréciée.

Merci.

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

    }

}

////////////////////// MA LISTE CLASSE FRAGMENT

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

}
14
user1319668

Vous pouvez facilement y parvenir en utilisant INTERFACE

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;
    }
}
23
Biraj Zalavadia
  • Rendez simplement votre méthode de mise à jour/actualisation publique et appelez-la à partir de votre activité.

OR

  • Utilisez LocalBroadcastManager ou EventBus pour envoyer un événement à partir de votre activité et en vous abonnant à cet événement dans un fragment - réagissez-y et appelez la méthode de rafraîchissement/mise à jour.
5
localhost

Votre activité peut appeler des méthodes dans le fragment en acquérant une référence au fragment.

(1) Fournissez une étiquette lorsque vous ajoutez votre fragment.

transaction.add(R.id.fragment_container, myFragment, "myfragmentTag");

(2) Dans votre activité hosting, vous pouvez trouver le fragment et avoir accès à ses méthodes.

FragmentManager fm = getSupportFragmentManager();
myFragment f = (myFragment) fm.findFragmentByTag("myfragmentTag");
f.refreshAdapter()

(3) refreshAdapter () peut désormais appeler adapter.notifyDataSetChanged ().

C’est l’un des moyens recommandés pour communiquer jusqu’à un fragment . L’implémentation de l’interface sert principalement à renvoyer à l’activité.

2
Jeffrey

La réponse de Biraj Zalavadia est exacte à 100%, vous appellerez aucune méthode de fragment à partir d'une interface .... Cette méthode d'interface s'exécute sans erreur.

utilisez ceci dans MainActivity ci-dessus oncreate private FragmentRefreshListener fragmentRefreshListener;

public FragmentRefreshListener getFragmentRefreshListener() {
    return fragmentRefreshListener;
}

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

à l'intérieur de l'activité 

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

}

et mettre cela dans le fragment nécessaire

private FragmentRefreshListener fragmentRefreshListener;

    public FragmentRefreshListener getFragmentRefreshListener() {
        return fragmentRefreshListener;
    }

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

Lorsque vous cliquez sur ActionBar n'importe quel bouton, puis appelez l'interface pour actualiser le ListFragment. Parce qu'en Java, l'interface est utilisée pour l'intercommunication.

0
Ramkailash

Communiquer avec d'autres fragments

http://developer.Android.com/training/basics/fragments/communicating.html

Ceci peut également être utilisé pour communiquer entre une activité et un fragment.

0
Francesco verheye