2013-01-20 51 views
5

我試圖用陣列適配器使用片段和列表視圖,並且無法從陣列適配器中的onClickListener調用我的方法。我的業務邏輯應該在上面的片段還是活動中?

如果我正確理解模式,一個片段應該是自給自足的,所以我想把我的業務邏輯放在那裏。但我無法設法從陣列適配器調用它。如果我把它放在主要活動中,我可以稱它,但是這並不妨礙我在另一個活動中使用這個片段並打破範式?

我的業務邏輯錯誤嗎?或者我沒有正確調用它?

這是我的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; 
    } 

回答

2

Adapter不應該什麼叫任何點擊監聽器,並且不應該附加在getView()方法點擊收聽。相反,您應該使用ListFragment,並簡單地覆蓋片段中的onListItemClick()。然後,您可以通過調用偵聽器接口回調將該事件分派到Activity,或直接在Fragment中處理它。如果您想要在SDK 11發佈之前支持Android版本,您也可以使用support library

2

不要上傳您給出的上下文,這會隱式地將適配器耦合到該特定的活動,而不會在構造函數中聲明它簽名。

由於你有如此強大的耦合,可以將RecipientsFragment作爲參數添加到構造函數中,或者執行Joe建議並在Fragment本身的ListView中使用onListItemClick。但是,在適配器中使用OnClickListener通常有合法用途(例如,多個可點擊的項目),所以在這些情況下,您必須僅通過片段本身。

如果您發現超過2種不同的東西將使用該適配器(比如3個不同的Fragments),請引入一個回調接口並讓Fragments實現它(並將該接口作爲參數傳遞給構造函數)。

相關問題