2010-04-01 8 views
14

J'essaie de faire (pour apprendre) ma propre implémentation d'un simple AdapterView où les éléments proviennent d'un adaptateur de base (ImageAdapter des échantillons sdk).Extension AdapterView

code actuel est comme ceci:

public class MyAdapterView extends AdapterView<ImageAdapter> implements AdapterView.OnItemClickListener{ 
    private ImageAdapter mAdapter; 
    public MyAdapterView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initThings(); 
    } 
    private void initThings(){ 
     setOnItemClickListener(this); 
    } 
    @Override 
    public ImageAdapter getAdapter() { 
     // TODO Auto-generated method stub 
     return mAdapter; 
    } 
    @Override 
    public void setAdapter(ImageAdapter adapter) { 
     // TODO Auto-generated method stub 
     mAdapter=adapter; 
     requestLayout(); 
    } 
    View obtainView(int position) { 
     View child = mAdapter.getView(position, null, this); 
     return child; 
    } 
    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
     for(int i=0;i<mAdapter.getCount();i++){ 
      View child = obtainView(i); 
      child.layout(10, 70*i, 70, 70); 
      addViewInLayout(child, i, null, true); 
     } 
     this.invalidate(); 
    } 
    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
     Log.d("MYEXAMPLES","Clicked an item!"); 
    } 
} 

Ce n'est pas un chef-d'œuvre de codage, il affiche juste un pseudo-listview avec des images. Je sais que j'aurais pu utiliser ListView, GridView, Spinner, etc. mais je suis relativement nouveau pour Android et j'essaie de comprendre certaines choses à ce sujet.

Eh bien, la question ici est: Pourquoi mon onItemClick ne se déclenche pas? En utilisant le même ImageAdapter avec un GridView, tout fonctionne bien, mais quand je l'utilise avec la classe ci-dessus, je n'ai rien. À l'intérieur AdapterView.java il y a du code pour ces événements click, longclick, etc ... alors pourquoi ne puis-je pas les déclencher? Peut-être que je ne comprends pas les choses de base sur le fonctionnement de AdapterView? Dois-je étendre d'autres classes de base à la place? Et pourquoi?

En espérant trouver des conseils plus expérimentés ici, merci d'avance.

+0

Avez-vous obtenir la solution ?? – Riser

Répondre

0

Au lieu d'étendre AdapterView, pourquoi ne pas essayer avec le baseAdapter. Lorsque vous costumez votre adaptateur, il a une méthode oen donnée ci-dessous.

getView(int position, View convertView,ViewGroup group) 

dans la méthode ci-dessus vous pouvez accéder à la mise en page pour chaque élément de la liste des listview et ici vous pouvez définir les tous les événements pris en charge pour chaque contrôle.

+1

Je savais mettre mes propres écouteurs onClick pour chaque vue sur l'adaptateur, mais est-ce acceptable? Je pourrais aussi le faire dans ma classe en ajoutant onClickListeners à chaque enfant après "addViewInLayout" ... Mais je pensais que l'adaptateur devrait gérer seulement "articles" et la vue (AdapterView) devrait gérer la position, les événements, et ainsi de suite. .. Est-ce le même ListView/GridView faire ... leur hiérarchie va de AdapterView-> AbsListView-> ListView, donc je pensais que je pourrais faire quelque chose de similaire, mais cela ne fonctionne pas ... –

0

Je joue avec quelque chose de similaire et j'utilise onItem * Sélectionné * Écouteur qui peut être plus que ce que vous cherchez.

3

Si vous jetez un coup d'oeil dans les sources d » AdapterView, vous verrez que le OnItemClickListener obtient invoqué dans une méthode, appelée performItemClick:

public boolean performItemClick(View view, int position, long id) { 
    if (mOnItemClickListener != null) { 
     // ... 
     mOnItemClickListener.onItemClick(this, view, position, id); 
     return true; 
    } 
    return false; 
} 

Cependant, si vous recherchez la source AdapterView pour laquelle cette méthode est utilisé, vous verrez qu'il n'est pas appelé n'importe où!

En effet, si vous cochez la source du Gallery par exemple, vous verrez que le performItemClick est appelé dans le traitement des onSingleTapUp ou onKeyUp événements.

Si vous voulez utiliser cela, vous devez détecter quand un utilisateur clique quelque part et appeler le performItemClick par vous-même.