2013-01-20 8 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内で直接処理することができます。

2

あなたが与えられたコンテキストをアップキャストしないでください。これは、コンストラクタでアナウンスせずに、その特定のアクティビティに暗黙的にそのアダプタを結合していることになります。support libraryを使用することもできます。署名。

あなたは強力なカップリングを持っているため、コンストラクタにパラメータとしてRecipientsFragmentを追加するか、Joeが提案したとおりにフラグメントのListViewにonListItemClickを使用してください。ただし、アダプター(たとえば複数のクリック可能なアイテム)にOnClickListenerを使用する正当な用途があることが多いため、その場合はフラグメント自体を渡すだけです。

2つ以上のものがそのアダプタ(たとえば3つの異なるフラグメント)を使用することが分かっている場合、コールバックインターフェイスを導入し、フラグメントを実装してそのインターフェイスをコンストラクタのパラメータとして渡します。

関連する問題