2013-01-20 17 views
5

Próbuję użyć fragmentów i widoku listy z adapterem tablicowym i mając problemy z wywoływaniem mojej metody z onClickListener w adapterze tablicowym.Czy moja logika biznesowa powinna znajdować się we fragmencie lub w powyższej czynności?

Jeśli dobrze rozumiem wzór, fragment powinien być samowystarczalny, więc chcę umieścić tam moją logikę biznesową. Ale nie mogę wywołać go z adaptera tablicowego. Mogę to nazwać, jeśli umieściłem to w głównej działalności, ale czy to nie wyklucza użycia fragmentu w innej działalności i przełamania paradygmatu?

Czy moja logika biznesowa jest w niewłaściwym miejscu, czy też nie nazywam jej poprawnie?

Oto mój 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; 
    } 

Odpowiedz

2

Adapter nie powinno być co wywołuje jakiekolwiek detektory kliknięcie, a nie powinno być dołączenie kliknij słuchacza w metodzie getView(). Zamiast tego powinieneś używać ListFragment, i po prostu zastąpić onListItemClick() w fragmencie. Następnie możesz wysłać to zdarzenie do Activity, wywołując wywołanie interfejsu interfejsu nasłuchującego lub obsługiwać je bezpośrednio w Fragmentie. Można również użyć support library jeśli chcesz obsługiwać wersje Androida przed wydaniem SDK 11.

2

Nie uskok kontekst masz podane, to jest niejawnie sprzęgania adapter do danej działalności, nie ogłaszając go w konstruktorze podpis.

Ponieważ masz tak silne sprzężenie, dodaj RecipientsFragment jako parametr konstruktora lub zrób to, co Joe sugeruje i użyj onListItemClick w ListView w samym fragmencie. Jednak często używa się OnClickListener s w adapterze (np. Wiele klikalnych elementów), więc w tych przypadkach trzeba po prostu przekazać fragment samego siebie.

Jeśli okaże się, że więcej niż 2 różne rzeczy będą używać tego adaptera (powiedzmy, 3 różne fragmenty), wprowadź interfejs wywołania zwrotnego i zmodyfikuj go za pomocą fragmentów (i przekaż ten interfejs jako parametr konstruktorowi).

Powiązane problemy