34 votes

Meilleur endroit pour ajouterHeaderView dans ListFragment

Je vais avoir quelques difficultés à configurer mon en-tête personnalisé dans ma liste.

Je suis de la création d'un ListFragment avec un adaptateur personnalisé. J'ai la liste de travail, mais je suis à essayer de comprendre où dans le cycle de vie d'un Fragment de joindre l'en-tête.

Je sais que l'en-tête doit être ajouté avant de configurer votre adaptateur.

J'ai essayé d'ajouter mon en-tête dans onActivityCreated, mais qui est appelée à chaque fois que mon Fragment de revient de la backstack, et depuis que j'ai également mis ma carte dans onActivityCreated, il échoue.

J'ai essayé de l'ajouter dans onCreate, mais le point de vue de la hiérarchie n'est pas disponible à ce stade du cycle de vie.

J'ai essayé de l'ajouter dans onCreateView, mais je ne pouvais pas insensible à la vue retourné à partir de gonfler à une ListView. Donc je ne pouvais pas ajouter l'en-tête de la vanille, de la Vue.

Toutes les pensées?

34voto

Ugo Points 1102

Je ne sais pas si vous avez résolu votre problème, mais voici une solution qui a fonctionné pour moi:

Ne pas téléphoner ListFragment.setListAdapter() votre ListFragment.onCreate(). Assurez-vous que vous disposez d'un champ variable qui peut contenir l'en-tête de la vue, peut-être comme:

View mheaderView;

Puis dans votre ListFragment.onCreateView(), gonfler l'en-tête de la Vue et de l'affecter à la variable comme ceci:

View list_root = inflater.inflate(R.layout.fragment_list, null);
// Get the list header - to be added later in the lifecycle
// during onActivityCreated()
mheaderView = inflater.inflate(R.layout.list_header, null);
return list_root;

Enfin, dans votre ListFragment.onActivityCreated() vous pouvez maintenant appeler ListFragment.getListView().addHeaderView(). Fondamentalement, quelque chose comme ça:

super.onActivityCreated(savedInstanceState);
if (mheaderView != null)  this.getListView().addHeaderView(headerView);
// Don't forget to now call setListAdapter()
this.setListAdapter(listAdapter);

32voto

delformo Points 613

Cette solution fonctionne avec le retournement d'écran:

Dans onActivityCreated ():

 getListView().addHeaderView(mHeaderView);
if (mMyAdapter == null) {
    mMyAdapter = new MyAdapter(getActivity(), null);
}
setListAdapter(mMyAdapter);
 

Et dans onDestroyView ()

 setListAdapter(null);
 

18voto

user956415 Points 3301

Ma solution

 public void onActivityCreated(Bundle savedInstanceState) {

setListAdapter(null);
getListView().addHeaderView(mHeader);
setListAdapter(mAdapter);
 

2voto

petrnohejl Points 2483

Ceci est ma solution pour gérer le pied de page / en-tête en vue liste. Je l'utilise en fragment retenu. L'adaptateur est initialisé dans la méthode renderView (). Cette méthode peut être appelée combien de fois vous avez besoin (par exemple pour actualiser les données dans la vue) et le pied de page / en-tête fonctionne correctement. J'ai testé ce code sur Android 2,3,4.

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

    ...

    renderView();
}


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

    // free adapter
    setListAdapter(null);
}


private void renderView()
{
    // reference
    ListView listView = getListView();

    // adapter
    if(getListAdapter()==null)
    {
        // init adapter
        mAdapter = new MyAdapter(...);
    }
    else
    {
        // refill adapter
        // this method assign array list object to adapter and call notifyDataSetChanged()
        mAdapter.refill(...);
    }

    // add footer
    setListAdapter(null);
    if(listView.getFooterViewsCount()==0)
    {
        mFooterView = getActivity().getLayoutInflater().inflate(R.layout.my_footer, null);
        listView.addFooterView(mFooterView);
    }

    // set adapter
    setListAdapter(mAdapter);
}
 

2voto

Comme solution courte qui a fonctionné pour moi:

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

    View headerView = getActivity().getLayoutInflater().inflate(R.layout.header, null);
    getListView().addHeaderView(headerView);

    ArrayAdapter<XY> mAdapter = createAdapter(); // create here your own adapter
    setListAdapter(mAdapter);
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    setListAdapter(null);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X