Saturday, October 12, 2013

Custom view with button in ArrayAdapter

I have defined a custom view (xml) for my ArrayAdapter for a ListView, which adds a Button. I’d like to create an OnClickListener for this Button per row, yet without creating a custom adapter. Is that possible, or does Android force me to create a custom ArrayAdapter for my ListView?

Here’s a snippet of what I’m doing:

glAdapter = new ArrayAdapter<Group>(getActivity(), R.layout.fragment_grouprow, R.id.groupRowText, ListOfGroups);ListView groupListView = (ListView)mainView.findViewById(R.id.listViewGroupMain);groupListView.setAdapter(glAdapter);groupListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {    @Override      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {          // Call function      }});

Now I’d like to add an OnClickListener for the Button in my custom view.

Thanks in advance,

Lali

You have to implement you own Adapter & in getView() method set OnClickListener on your button. Here kick off example:

public class CustomAdapter extends ArrayAdapter<Integer> {    private ListView listView;    public CustomAdapter(Context context, int textViewResourceId, Integer[] objects, ListView listView) {        super(context, textViewResourceId, objects);        this.listView = listView;    }    static class ViewHolder {        TextView text;        Button btn;    }    @Override    public View getView(final int position, View convertView, ViewGroup parent) {        Integer color = getItem(position);        View rowView = convertView;        if (rowView == null) {            LayoutInflater inflater = ((Activity) getContext()).getLayoutInflater();            rowView = inflater.inflate(R.layout.list_view_row, parent, false);            ViewHolder h = new ViewHolder();            h.text = (TextView) rowView.findViewById(R.id.item_text);            h.btn = rowView.findViewById(R.id.btn);            rowView.setTag(h);        }        ViewHolder h = (ViewHolder) rowView.getTag();        h.text.setText(color);        h.indicator.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // DO what you want to recieve on btn click there.            }        });        return rowView;    }}

ViewHolder here for optimization. You can read approximately this there.

No comments:

Post a Comment