2011-09-14 21 views
0

これは私の簡単なアダプタです:アダプタで生成されたボタンにクリックリスナーを設定するにはどうすればよいですか?

public class MainAdapter extends BaseAdapter { 

    private Context mContext; 

    private Integer[] mText = { 
      R.string.main_team, 
      R.string.main_league, 
      R.string.main_economy, 
      R.string.main_arena, 
      R.string.main_staff, 
      R.string.main_team_up 
    }; 

    public MainAdapter(Context c) { 
     mContext = c; 
    } 

    @Override 
    public int getCount() { 
     return mText.length; 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Button buttonView; 
     if (convertView == null) { // if it's not recycled, initialize some attributes 
      buttonView = new Button(mContext); 
      buttonView.setLayoutParams(new GridView.LayoutParams(85, 45)); 
      //imageView.setScaleType(Button.ScaleType.CENTER_CROP); 
      buttonView.setPadding(4, 4, 4, 4); 
     } else { 
      buttonView = (Button) convertView; 
     } 

     buttonView.setText(mText[position]); 
     return buttonView; 
    } 

} 

すべてのボタンには独自の意思を開始する必要があります。 私はポジションに基づいてスイッチケースを使用することを考えていましたが、解決策としては本当に「ばかげた」ようです。

答えて

1

私は新しいオブジェクトを作成します。 ActivityLaunchButtonDataは、ボタンのテキストとボタンのインテントを保存します。

次に、私はActivityLaunchButtonDataオブジェクトの配列を持っています。

が続いgetView方法で、私のようなものがあるだろう:あなたが知っている場合は、あなたのアダプタで、それに入れて発射する意図とデータを

ActivityLaunchButtonData activityLaunchButtonData = activityLaunchButtonDataArray[position]; 
buttonView.setText(activityLaunchButtonData.getText()); 
buttonView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = activityLaunchButtonData.getIntent(); 
      startActivity(intent); 
     } 
    }); 
+0

配列を使用しましたが、OnClickListenerの配列を選択した後、View arg0を使用してアクティビティを起動しました。 – dierre

+0

このようなonClickアクションのための別の配列については否定的です。つまり、2つの配列を維持して、それらを同期させておく必要があります。 mText配列内で2つのものを動かした場合、関連するonClickListenerも移動する必要があります。 – C0deAttack

+0

本当に、それはメインメニューだと言わなければならないので、実際に移動させる本当の理由はありませんが、そのことを念頭に置いておきます。 – dierre

0

を、あなたはそのような何かを試すことができます。

public class MainAdapter extends BaseAdapter implements OnClickListener { 

    private Context mContext; 
    private Activity mActivity; 

    private Integer[] mText = { 
     R.string.main_team, 
     R.string.main_league, 
     R.string.main_economy, 
     R.string.main_arena, 
     R.string.main_staff, 
     R.string.main_team_up 
    }; 

    public MainAdapter(Context c,Activity a) { 
     mContext = c; 
     mActivity = a; 
    } 

    ... 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Button buttonView; 
     if (convertView == null) { // if it's not recycled, initialize some attributes 
      buttonView = new Button(mContext); 
      buttonView.setLayoutParams(new GridView.LayoutParams(85, 45)); 
      //imageView.setScaleType(Button.ScaleType.CENTER_CROP); 
      buttonView.setPadding(4, 4, 4, 4); 
     } else { 
      buttonView = (Button) convertView; 
     } 

     buttonView.setText(mText[position]); 
     // For exemple a String, but setTag takes an object 
     buttonView.setTag("dataToSendThrewTheIntent"); 
     buttonView.setOnClickListener(this); 
     return buttonView; 
    } 

    @Override 
    public void onClick(View v) { 
     String dataToSendThrewTheIntent = (String) v.getTag(); 
     Intent i = new Intent(mContext, DestinationActivity.class); 
     i.putExtra("key", dataToSendThrewTheIntent); 
     mActivity.startActivity(i); 
    } 
} 

このメソッドは、複数のonClickリスナーを回避します。

関連する問題