2016-05-18 8 views
1

Ich habe ein ListView mit folgenden Adapter:Kann ich Listener im empfangenden Element eines listView hinzufügen?

public class gestionAdapter extends ArrayAdapter<Sav> { 

    public gestionAdapter(Context context, List<Sav> savs){ 
     super(context, 0, savs); 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null){ 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.adapter_gestion,parent, false); 
     } 
     Sav sav = getItem(position); 
     ViewHolderGestion viewHolder = (ViewHolderGestion) convertView.getTag(); 
     if(viewHolder == null){ 
      viewHolder = new ViewHolderGestion(); 
      viewHolder.titreSav = (TextView) convertView.findViewById(R.id.TitreSav); 
      viewHolder.intervenant = (TextView) convertView.findViewById(R.id.interv); 
      viewHolder.client = (TextView) convertView.findViewById(R.id.cli); 
      viewHolder.archive = (Button) convertView.findViewById(R.id.archive); 
      viewHolder.actif = (Button) convertView.findViewById(R.id.actif); 
      convertView.setTag(viewHolder); 
      viewHolder.archive.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(getContext(), "archive ", Toast.LENGTH_LONG).show(); 
       } 

      }); 
      viewHolder.actif.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(getContext(), "actif ", Toast.LENGTH_LONG).show(); 
       } 
      }); 
     } 
     viewHolder.titreSav.setText(sav.getTitre()); 
     viewHolder.intervenant.setText(sav.getIntervenant()); 
     viewHolder.client.setText(sav.getNomClient()); 
     return convertView; 
    } 
} 

Wie Sie sehen, gibt es zwei buttons für jede Zeile. Im Moment habe ich die Listener in die Adapter platziert Aber ist es möglich, diese Listener in der Empfangsansicht zu setzen, damit ich diese Schaltflächen verwenden kann, um meine Ansicht zum Beispiel zu aktualisieren?

Im Moment habe ich versucht, einige der Funktionen meines Views öffentlich zu machen, aber ich bin überhaupt nicht mit dieser Lösung zufrieden.

+0

Ich verstehe Sie nicht vollständig, aber Sie können Listener für Ihre Root-Layout zu. Auch Ihre ViewHolder-Musterlogik in Ihrem Adapter ist nicht korrekt. – Amir

+0

es scheint, dass ich nicht diese Elemente aus der Aktivität zugreifen können, die Listenansicht zeigt – RiddlerNewComer

+0

Sie entweder listner auf Root-Layout setzen können, setzen listner auf Listview someListView.setOnItemClickListener (neu OnItemClickListener() { @Override public void onItemClick (AdapterView arg0, Ansicht arg1, int arg2, lang arg3) { // TODO Automatisch generierter Methoden-Stub Log.d ("#############", "Items" + MoreItems [ arg2]); } }); – Rafal

Antwort

0

Erste Dinge, die Ihre Ansicht zu erwähnenHolder-Muster ist nicht korrekt nehmen Sie einen Blick auf here.

Zweite Sache ist, dass, wenn Sie auf Ihre rootLayout innerhalb Aktivität zugreifen möchten einfachste Weg ist, Listener in Ihrem Adapter definieren und dann in Ihrer Aktivität benachrichtigen.

zum Beispiel folgende Schnittstelle in Ihrem Adapter definieren und Instanz in Ihrem Adapter erstellen:

private OnBackClickListener onBackClickListener; 

public interface OnBackClickListener { 
     void onBackClick(); 
    } 

Dann, wenn Ihr rootLayout in Ihrem Adapter Aufruf folgende Methode angeklickt:

rootView.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (onBackClickListener != null) { 
        onBackClickListener.onBackClick(); 
       } 
      } 
     }); 

In Ihrer Tätigkeit passiert diese Listener zu Ihrem Adapter wie folgt:

MyAdapter adapter = new MyAdapter(context,new OnBackClickListener(){//rest of things}); 

Jetzt in Ihrem A ctivity, wenn rootLayout geklickt OnBackClickListener von Ihrem Adapter benachrichtigt Sie.

Bei RecyclerView finden Sie vollständige Implementierung here.

+1

vielen Dank, ich werde beide Methoden versuchen und sehen, was mir am meisten passt – RiddlerNewComer

+0

Beide Methoden sind die gleichen, viel Glück. – Amir

0

Sie können die Zuhörer auf Ihre Aktivität hinzufügen, aber Sie nicht in der Lage sein zu zeigen, welche Ansicht hat clicked.Instead Sie es wie diese

tun können
public static class ViewHolderTwo extends RecyclerView.ViewHolder implements View.OnClickListener { 
    private TextView dictionaryWord; 
    private TextView dictionaryShortcut; 
    private CheckBox deleteWord; 
    public interface Listener 
    { public void viewOneclicked(); 
     public void viewTwoClicked(); 
    } 
    private Listener mListener; 


    public ViewHolderTwo(View v,Listener listener) { 
     super(v); 
     this.mListener = listener; 
     dictionaryWord = (TextView) v.findViewById(R.id.dictionaryWord); 
     dictionaryShortcut = (TextView) v.findViewById(R.id.dictionaryShortcut); 
     deleteWord = (CheckBox) v.findViewById(R.id.deleteWord); 
    } 

    @Override 
    public void onClick(View v) { 
     if(v == dictionaryWord) 
     { 
     mListener.viewOneClicked(); 
     return; 
     } 
} 

und machen Sie Ihre Aktivität Zuhörer implementieren und seine Referenz zu übergeben in Viewholders Konstruktor

+0

Und auf diese Weise kann ich die Methoden in meiner Aktivität im Listener verwenden? – RiddlerNewComer

+0

Ja, Sie können Aktivitätsmethoden mit Viewholder verwenden, indem Sie sie in Aktivität umwandeln und auf Nullzeiger prüfen. Stellen Sie jedoch sicher, dass Sie keine Referenzen auf Listener halten, wenn die Aktivität nicht mehr im Speicher ist – user3300839

Verwandte Themen