2013-01-20 3 views
5

Ich versuche, Fragmente und eine Listenansicht mit einem Array-Adapter zu verwenden, und Probleme beim Aufrufen meiner Methode aus dem OnClickListener im Array-Adapter.Sollte meine Geschäftslogik in dem Fragment oder der Aktivität oben sein?

Wenn ich das Muster richtig verstehe, sollte ein Fragment autark sein, also möchte ich meine Geschäftslogik dort hineinlegen. Aber ich kann es nicht aus dem Array-Adapter aufrufen. Ich kann es nennen, wenn ich es in die Hauptaktivität lege, aber hindert mich das nicht daran, das Fragment in einer anderen Aktivität zu verwenden und das Paradigma zu brechen?

Ist meine Geschäftslogik am falschen Ort, oder rufe ich sie nicht richtig an?

Hier ist mein ArrayAdapter;

public class RecipientsListAdapter extends ArrayAdapter<Recipient>{ 

    Context context; 
    int layoutResourceId; 
    Recipient data[] = null; 

    public RecipientsListAdapter(Context context, int layoutResourceId, Recipient[] data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     RecipientHolder holder = null; 

     final boolean isLastRow = (position == data.length-1); 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new RecipientHolder(); 
      holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
      holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (RecipientHolder)row.getTag(); 
     } 

     final Recipient recipient = data[position]; 
     holder.txtTitle.setText(recipient.displayName); 
     holder.imgIcon.setImageResource(recipient.icon); 

     row.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ((MainActivity)context).onChildItemSelected(position); 
       if(isLastRow){ 
       //((RecipientsFragment).getContext()).launchContactPicker(); 


        ((MainActivity)context)).launchContactPicker(); 


       } 
       else{ 
        Toast.makeText(getContext(), recipient.displayName, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 

     return row; 
    } 

Antwort

2

Die Adapter sollte nicht sein, was jeden Klick Zuhörer ruft, und soll nicht einen Klick Zuhörer in der getView() Methode werden zu befestigen. Stattdessen sollten Sie ListFragment verwenden und einfach onListItemClick() im Fragment überschreiben. Dann können Sie entweder dieses Ereignis an die Activity senden, indem Sie einen Listener-Interface-Callback aufrufen, oder direkt innerhalb des Fragments. Sie können auch die support library verwenden, wenn Sie Android-Versionen vor der Veröffentlichung von SDK 11 unterstützen möchten.

2

Erhöhen Sie nicht den Kontext, den Sie erhalten, das Koppeln des Adapters implizit mit dieser bestimmten Aktivität ohne Ankündigung im Konstruktor Unterschrift.

Da Sie eine solch starke Kopplung haben, fügen Sie entweder RecipientsFragment als Parameter zum Konstruktor hinzu, oder tun Sie, was Joe vorschlägt und verwenden Sie onListItemClick auf der ListView im Fragment selbst. Es gibt jedoch häufig legitime Verwendungen für die Verwendung von OnClickListener s im Adapter (z. B. mehrere anklickbare Elemente), so dass Sie in diesen Fällen das Fragment selbst übergeben müssen.

Wenn Sie feststellen, dass mehr als 2 verschiedene Dinge diesen Adapter verwenden (zB 3 verschiedene Fragmente), führen Sie eine Callback-Schnittstelle ein und lassen Sie die Fragmente implementieren (und übergeben Sie diese Schnittstelle als Parameter an den Konstruktor).

Verwandte Themen