dierre
dierre

Reputation: 7210

How to set the click listener on a button generated by my adapter?

This is my simple adapter:

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;
    }

}

Every button has to start its own intent. I was thinking of using a switch case based on the position but it seems really "stupid" as solution.

Upvotes: 0

Views: 2218

Answers (2)

ol_v_er
ol_v_er

Reputation: 27284

If you know, in your adapter the intent to fire and the data to put in it you can try something like that:

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);
    }
}

This method avoids multiple onClick listeners.

Upvotes: 0

C0deAttack
C0deAttack

Reputation: 24667

I would create a new object, eg. ActivityLaunchButtonData to store the button Text and the button Intent.

Then I would have an array of ActivityLaunchButtonData objects.

Then in the getView method I'd have something like:

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

Upvotes: 1

Related Questions