95 votes

ListView addHeaderView provoque la position augmenter d’un ?

Ci-dessous est un extrait de code avec un contrôle ListView. J'ai ajouté une emptyView et un headerView. L'ajout de la headerView cause de la position dans le onItemClick être augmentée par une.

Donc, sans le headerView le premier élément de la liste aurait position 0, avec la headerView la position du premier élément de la liste sera de 1!

Cela provoque des erreurs dans ma carte, par exemple lors de l'appel de getItem() et en utilisant d'autres méthodes, voir ci-dessous. Chose étrange: Dans le getView() la méthode de la carte le premier élément de la liste est demandé à la position 0, même si le headerView est ajouté!!

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ListView list = (ListView) viewSwitcher.findViewById(R.id.list);
    View emptyView = viewSwitcher.findViewById(R.id.empty);
    list.setEmptyView(emptyView);

    View sectionHeading = inflater.inflate(R.layout.heading, list, false);
    TextView sectionHeadingTextView = (TextView) sectionHeading.findViewById(R.id.headingText);
    sectionHeadingTextView.setText(headerText);
    list.addHeaderView(sectionHeading);

    list.setAdapter(listAdapter);

    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            listAdapter.getItem(position);
            //Do something with it
        }
    });
}

Certaines méthodes de l'adaptateur:

@Override
public int getViewTypeCount() {
    return TYPE_COUNT;
}

@Override
public int getItemViewType(int position) {
    return (position < items.size()) ? ITEM_NORMAL : ITEM_ADVANCED;
}

    @Override
public Product getItem(int position) {
    return items.get(position);
}
@Override
public boolean areAllItemsEnabled() {
    return false;
}

@Override
public boolean isEnabled(int position) {
    return (position < items.size());
}

Est-ce le comportement normal lors de l'ajout d'un headerView?? Et la façon de surmonter les problèmes dans ma carte?

113voto

Ian Warwick Points 2452

Je viens de découvrir ce problème et le meilleur moyen semble être d’utiliser le au lieu de comme la `` version représente les en-têtes, c’est à dire :-

Pour ce faire à la place :

31voto

farid_z Points 375

Si vous ne se souciez le déclic pour l’en-tête, soustraire le nombre de vues d’en-tête de la position pour obtenir la position de votre carte :

27voto

akshaydashrath Points 459

Si vous ajoutez un en-tête à un qui devient le premier élément de la liste. Vous pouvez compenser cela en substituant le pour retourner un élément de moins, mais assurer vous gérer le , et ainsi de suite comme l’en-tête serait l’élément en position 0.

13voto

Ramesh Points 3483

Pas besoin de changer n’importe quel code. Il suffit d’utiliser code ci-dessous.

list.setOnItemClickListener (new OnItemClickListener() {}

9voto

whuandroid Points 337

Ne pas utiliser votre adaptateur, utiliser « décoré » adaptateur de getAdapter.

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