Extension de l'adaptateur

J'essaie de créer (à des fins d'apprentissage) ma propre implémentation d'un AdapterView simple où les éléments proviennent d'un adaptateur de base (ImageAdapter à partir d'échantillons sdk).

Le 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 codant, il affiche simplement une pseudo-liste avec des images. Je sais que j'aurais pu utiliser ListView, GridView, Spinner, etc., mais je suis relativement nouveau sur Android, et j'essaie de comprendre certaines choses.

Eh bien, la question est la suivante: Pourquoi mon OnItemClick ne lance pas?

En utilisant le même ImageAdapter avec un GridView, tout fonctionne correctement, mais quand j'utilise avec la classe ci-dessus, je n'ai rien. À l'intérieur de AdapterView.java, il existe un code pour les événements click, longclick, etc … alors, pourquoi ne puis-je pas les licencier? Peut-être que je comprends mal les choses de base sur la façon dont AdapterView fonctionne? Devrais-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.

  • Comment obtenir un objet de listview dans setOnItemClickListener dans Android?
  • Utilisation correcte de setEmtpyView dans AdapterView
  • Un moyen correct d'implémenter onMeasure () et onLayout () dans AdapterView personnalisé
  • IsItemChecked renvoie toujours le contraire de ce qu'il est censé à l'intérieur d'un onItemClickListener?
  • Java.lang.UnsupportedOperationException: addView (View, LayoutParams) n'est pas pris en charge dans AdapterView
  • Android AdapterView?
  • RecyclerView - Où puis-je gérer ses événements de clic?
  • Impossible de démarrer l'activité: UnsupportedOperationException: addView (View, LayoutParams) n'est pas pris en charge dans AdapterView
  • 3 Solutions collect form web for “Extension de l'adaptateur”

    Si vous AdapterView les sources d' AdapterView , vous verrez que OnItemClickListener est 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 l'utilisation de cette méthode, vous verrez qu'elle n'est pas appelée nulle part!

    En effet, si vous cochez la source de la Gallery par exemple, vous verrez que l'application performItemClick est appelée lors de la gestion des événements onSingleTapUp ou onKeyUp .

    Si vous souhaitez l'utiliser, vous devez détecter quand un utilisateur clique sur quelque part et appeler à l' performItemClick de votre propre performItemClick .

    Au lieu d'étendre l'AdapterView, pourquoi ne pas essayer avec baseAdapter. Lorsque vous utilisez votre adaptateur, il existe une méthode 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 liste de la liste et ici vous pouvez définir tous les événements pris en charge pour chaque contrôle.

    Je joue avec quelque chose de similaire et j'utilise OnItem * Selected * Listener, qui peut être plus ce que vous recherchez.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.