How to use onclick button in baseAdapter

16,665

Solution 1

You should use your Adapter to populate the list with the items. Then in your Activity or Fragment you should implement the onListItemClick event to handle the click on the list item.

EDIT: I am posting an example below where I am using a ListFragment - this is the piece of code I have available right now, I can post something specific to ListView later:

public class RecipiesActivity extends FragmentActivity {

    private RecipiesSummaryListAdapter m_listAdapter; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /* here you need to set the adapter of the listview 
           and do other things for your applicaiton (i.e. populate the 
           data in your adapter. In your case, since you are calling a 
           WS you want to do that in a different task */ 
        ListFragment lf = 
             (ListFragment) fm.findFragmentById(R.id.my_list_fragment);
        lf.setListAdapter(m_listAdapter);
}

Then in your ListFragment:

/* imports and other things go here then... */ 
public class MyListFragment extends ListFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        return (View) inflater.inflate(R.layout.myListViewXml, 
                                           container, false);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // put your handler here

    }   
}

For details on ListFragment see here.

I think that a very nice example (although by extending ArrayAdapter instead of BaseAdapter is hown in this stackoverflow answer.

There is one point to remember:

  1. The button must not be focusable (i.e. in XML use android:focusable="false" - like you have in your XML).
  2. You need to capture provide an onItemClick event handled as shown below (extract from the link above):

Code:

listview.setOnItemClickListener(new OnItemClickListener() {
    //@Override
    public void onItemClick(AdapterView arg0, View view,
                                  int position, long id) {
        // user clicked a list item, make it "selected"
        selectedAdapter.setSelectedPosition(position);
        //Do your stuff here
}

Finally, note one point. This solution means that you click on the list row and the event gets fired.

I think that if you want the user to click on the button and the event to get fired on the button, then you need to set call listview.setItemsCanFocus(true) right after you inflate your ListView XML and make sure that the Button is focusable in the XML. Listening for the onClick event should work then.

This is described in Slide 25 of the GoogleIO World of ListView presentation (you can get it here and the video is here)

Hope this helps

Solution 2

try the following for your button:

android:focusable="false"

Solution 3

Write the holder.btnList.setOnClickListener inside the if (rowView == null) condition and try again.

Solution 4

use the following code in getView() Method:

    Button status = (Button) rowView.findViewById(R.id.image1);
        status.setBackgroundResource(R.drawable.add_account);
        status.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                       // DO your stuff
            }
        });
Share:
16,665
Rao's
Author by

Rao's

Updated on June 15, 2022

Comments

  • Rao's
    Rao's almost 2 years

    How to use on click event button in extend baseadapter.. I tried a lot but no use.. In my project there is custom listview, it contain text,button(btnlist), fastscroll index. when i onclick button(btnlist) it is not gng to other activity, no error is also displaying,no toast..
    Plz help me with example . thank u in advance.

    Quick ref: getview---> holder.btnList.setOnClickListener

    EfficientAdapter.java

    public class EfficientAdapter extends BaseAdapter implements SectionIndexer, OnClickListener {
    IndexableListView mListView;
    private String mSections = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    ArrayList<Patient> patientListArray;
    
    private Intent intent;
    private Patient patient;
    private LayoutInflater mInflater;
    private Context context;
    private int positions;
    ViewHolder holder;
    
    
    public EfficientAdapter(Context context) {
        mInflater = LayoutInflater.from(context);
        this.context = context;
    
        String patientListJson = CountriesList.jsonData;
        JSONObject jssson;
        try {
            jssson = new JSONObject(patientListJson);
            patientListJson = jssson.getString("PostPatientDetailResult");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Gson gson = new Gson();
        JsonParser parser = new JsonParser();
        JsonArray Jarray = parser.parse(patientListJson).getAsJsonArray();
        patientListArray = new ArrayList<Patient>();
        for (JsonElement obj : Jarray) {
            Patient patientList = gson.fromJson(obj, Patient.class);
            patientListArray.add(patientList);
        //  Log.i("patientList", patientListJson);
    
        }
    }
    
    
    public int getCount() {
    
        return patientListArray.size();
    }
    
    public Object getItem(int position) {
    
        return position;
    }
    
    public long getItemId(int position) {
        return position;
    }
    
    public View getView(final int position, View convertView, ViewGroup parent) {
    
        this.positions = position;      
        View rowView = convertView;
    
        if (rowView  == null) {                     
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(R.layout.homemplebrowview, parent, false);
    
            holder = new ViewHolder();
            holder.text1 = (TextView) rowView.findViewById(R.id.name);
            holder.text2 = (TextView) rowView.findViewById(R.id.mrn);
            holder.text3 = (TextView) rowView.findViewById(R.id.date);
            holder.text4 = (TextView) rowView.findViewById(R.id.age);
            holder.text5 = (TextView) rowView.findViewById(R.id.gender);
            holder.text6 = (TextView) rowView.findViewById(R.id.wardno);
            holder.text7 = (TextView) rowView.findViewById(R.id.roomno);
            holder.text8 = (TextView) rowView.findViewById(R.id.bedno);
            holder.btnList = (Button) rowView.findViewById(R.id.listbutton);
            /*Button editButton = (Button) rowView.findViewById(R.id.listbutton) ;
            editButton.setTag(position);
            editButton.setClickable(true);
            editButton.setOnClickListener(EfficientAdapter.this);
            rowView.setClickable(true);*/
    
    
            rowView.setTag(holder);
        } else {
            holder = (ViewHolder) rowView.getTag();
        }
    
        holder.text1.setText(Util.formatN2H(patientListArray.get(position)
                .getName()));
        holder.text2.setText(patientListArray.get(position).getMrnNumber());
        holder.text3.setText(Util.formatN2H(patientListArray.get(position)
                .getRoom()));
        holder.text4.setText(Util.formatN2H(patientListArray.get(position)
                .getAge()));
        holder.text5.setText(Util.formatN2H(patientListArray.get(position)
                .getGender()));
        holder.text6.setText(Util.formatN2H(patientListArray.get(position)
                .getWard()));
        holder.text7.setText(Util.formatN2H(patientListArray.get(position)
                .getRoom()));
        holder.text8.setText(Util.formatN2H(patientListArray.get(position)
                .getBed()));        
        holder.btnList.setOnClickListener(new OnClickListener() {
    
            public void onClick(View v) {
                Toast.makeText(context, "STAT", Toast.LENGTH_SHORT).show();     
                Intent next = new Intent(context, SeviceDetails.class);
                Log.i("patient", " next "+ position + " onclickposition " + patientListArray.get(position).getMrnNumber());
                patient = getPatientDetailsByMrn(patientListArray, position);
                Log.i("DDDD ", patient.getMrnNumber());             
                next.putExtra("patient", patient);
                next.putExtra("position", position);
                System.out.println("patient"+ patient);
                context.startActivity(next);
            }
        });
    return rowView;
    }       
    
    static class ViewHolder {
        public Button btnList;
        public TextView text8;
        public TextView text7;
        public TextView text6;
        public TextView text5;
        public TextView text4;
        public TextView text1;
        public TextView text2;
        public TextView text3;
    }
    
    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }
    
    public int getPositionForSection(int section) {
        sortMyData();
    
        Log.i("getPositionForSection", "section" + section);
        // If there is no item for current section, previous section will be
        // selected
        for (int i = section; i >= 0; i--) {
            for (int j = 0; j < getCount(); j++) {
                if (i == 0) {
    
                    Log.i("getPositionForSection- i", "section" + i);
                    // For numeric section
                    for (int k = 0; k <= 9; k++) {
    
                        if (StringMatcher.match(
                                String.valueOf(patientListArray.get(j)
                                        .getName().charAt(0)),
                                String.valueOf(k)))
                            Log.i("getPositionForSection- j", "section" + j);
    
                            return j;
                    }
                } else {
                    if (StringMatcher.match(
                            String.valueOf(patientListArray.get(j).getName()
                                    .charAt(0)),
                            String.valueOf(mSections.charAt(i))))
                        return j;
                }
            }
        }
        return 0;
    }
    
    public int getSectionForPosition(int position) {
        return 0;
    }
    
    public Object[] getSections() {
        String[] sections = new String[mSections.length()];
        for (int i = 0; i < mSections.length(); i++)
            sections[i] = String.valueOf(mSections.charAt(i));
        return sections;
    }
    
    /**
     * sorting the patientListArray data
     */
    public void sortMyData() {
        // sorting the patientListArray data
        Collections.sort(patientListArray, new Comparator<Object>() {
            @Override
            public int compare(Object k1, Object k2) {
                Patient p1 = (Patient) k1;
                Patient p2 = (Patient) k2;
                return p1.getName().compareToIgnoreCase(p2.getName());
            }
    
        });
    }
    
    
         }
    

    .xml

      <Button
            android:id="@+id/listbutton"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignTop="@+id/name"
            android:layout_marginRight="43dp"   
            android:focusable="false"      
            android:text="Episode"
            android:textColor="#666666" />
    

    default listview

           <ListView 
    
             android:id="@+id/homelistView"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:dividerHeight="0dip" />
    
  • Rao's
    Rao's over 11 years
    sure.. plz update...dnt forget..i will try to add this code.. thanks for ur reply.
  • Lefteris
    Lefteris over 11 years
    btw, if you set android:focusable="false" for the button (like you have), then touching the list item should fire the onListItemClick event. This should be fine unless you have more than one buttons on the list row.
  • Lefteris
    Lefteris over 11 years
    update (Corrected the event) Note that the onItemSelected is on the ListView (not on the button) and it will include in the callback the postion clicked. Then use getItemAtPosition to get access to the specific item.