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

妖精的绣舞 提交于 2020-01-07 02:48:13

问题


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.


回答1:


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



回答2:


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.



来源:https://stackoverflow.com/questions/7422136/how-to-set-the-click-listener-on-a-button-generated-by-my-adapter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!