2017-05-08 1 views
0

Comment puis-je créer un setOnClickListener personnalisé pour ma classe?Définir onClickListener via MainActivity sur un élément dans un ListAdapter

J'ai actuellement un listAdapter avec des éléments (Made a Item Class). Chaque fois que je clique sur un élément de cette liste, je veux activer la fonctionnalité que j'ai décrite dans ma MainActivity. Je voudrais définir onClickListeners (custom onClickListeners) sur les classes que j'ai dans mon adaptateur de liste. Comment puis-je le faire?

Si vous ne me comprenez, ou si vous voulez aider, je zippé le projet et le mettre sur mon Google Drive

Je l'ai regardé à travers des dizaines de réponses, mais je ne pouvais pas trouver celui qui travaillait .. S'il vous plaît aider, car j'ai investi beaucoup de temps dans ce domaine.

Item item = new Item().setOnClickListener(new ItemListAdapter.ClickListener() { 
    @Override 
    public void onClick() { 
     Toast.makeText(MainActivity.this, "Clicked me", Toast.LENGTH_SHORT).show(); 
    } 
}); 

EDIT: Parce que je voudrais tourner plus tard dans une bibliothèque, il serait utile pour moi et l'utilisateur que vous pouvez définir un onclick sur un article plutôt que le listview, que je veux cacher de l'utilisateur éventuellement

+0

Que voulez-vous faire avec la logique exactement? – Krish

+0

J'ai édité ma question, peut-être que cela explique ce que je veux exactement – Jason

+0

Pourquoi avez-vous implémenté ClickListener dans l'activité? Y a-t-il une raison à cela? – Krish

Répondre

1

De ma compréhension que vous cherchez quelque chose comme ça, changer la classe comme celui-ci,

public class Item { 

    private int id; 
    private ItemListAdapter.ClickListener mClickListener; 

    public Item(int id) { 
     this.id = id; 
    } 


    public Item(int id, @NonNull ItemListAdapter.ClickListener clickListener) { 
     this.id = id; 
     this.mClickListener = clickListener; 
    } 


    public Item setOnClickListener(@NonNull ItemListAdapter.ClickListener clickListener) { 
     this.mClickListener = clickListener; 
     return this; 
    } 


    public ItemListAdapter.ClickListener getClickListener() { 
     return this.mClickListener; 
    } 

} 

classe Adaptateur

import android.content.Context; 
import android.support.annotation.NonNull; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.LinearLayout; 

public class ItemListAdapter extends ArrayAdapter<Item> { 


    public ItemListAdapter(Context context, int resource) { 
     super(context, resource, SettingsStorage.getInstance().getItems()); 
    } 

    @NonNull 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 


     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.item, parent, false); 
     } 

     final Item item = getItem(position); 
     LinearLayout linearLayout = (LinearLayout) convertView.findViewById(R.id.item); 
     linearLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (item.getClickListener() != null) { 
        item.getClickListener().onClick(); 
       } 
      } 
     }); 

     return convertView; 
    } 

    public interface ClickListener { 
     void onClick(); 
    } 
} 

et vous pouvez définir le lik d'auditeur e ce,

Item item1 = new Item(1); 
     item1.setOnClickListener(new ItemListAdapter.ClickListener() { 
      @Override 
      public void onClick() { 
       Toast.makeText(MainActivity.this, "It works", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     Item item2 = new Item(2, new ItemListAdapter.ClickListener() { 
      @Override 
      public void onClick() { 

      } 
     }); 
+0

Vous. Sont. Ma. Héros. Merci beaucoup! J'ai gaspillé les 2 dernières semaines sur ceci, et vous le résolvez pour moi! Je ne peux pas vous remercier assez! – Jason

+0

mais je recommanderais de passer l'article dans l'écouteur de clic. – Krish

+0

Okay! Je le regarderai demain (il est presque midi), merci! – Jason

0

Vous pouvez utiliser OnItemClickListener:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Item item = adapter.getItem(position); 
    } 
}); 

EDIT: le est que Item est juste un POJO, vous ne pouvez pas "cliquer" dessus. Ce que vous pouvez faire est une sorte de « transmettre » l'auditeur:

Class Item { 
    private ItemClickListener listener; 

    // getter/setter 

    interface ItemClickListener{ 
     void onItemClick(Item item); 
    } 
} 

// you implement this in your library 
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Item item = adapter.getItem(position); 
     item.getListener().onItemClick(item); 
    } 
}); 
+0

Je sais, mais comme il en résultera une bibliothèque, je voudrais l'option de faire l'article.setOnClickListener plutôt que l'utilisateur accédant à la liste elle-même – Jason

+0

Voir ma réponse éditée –

+0

J'ai vu d'autres bibliothèques faire la même chose, mais je n'arrive pas à reproduire .. par exemple "material drawer" de Mike penz. – Jason