user2872856
user2872856

Reputation: 2051

Custom ListView setOnItemClickListener

I have a ListView which was showed without extends ListActivity. I would like to enable setOnItemClickListener. This is my code under onCreate

adapter = new CustomAdapter(this, MyDB);
        setListAdapter(adapter);

        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position,
                                    long id) {

                Toast.makeText(getBaseContext(), "test", Toast.LENGTH_LONG).show();

            }

And I use the below code to enable ListView.

protected ListView getListView() {
        if (mListView == null) {
            mListView = (ListView) findViewById(android.R.id.list);
            empty = (TextView) findViewById(android.R.id.empty);
            mListView.setEmptyView(empty);
        }
        return mListView;
    }

    protected void setListAdapter(ListAdapter adapter) {
        getListView().setAdapter(adapter);
    }

However, the setOnItemClickListener is not working.

Upvotes: 1

Views: 578

Answers (3)

Sucho
Sucho

Reputation: 321

You can set OnClickListener on the adapter something like this-

public class DeviceList_Adapter extends BaseAdapter implements View.OnClickListener
{
/*************  CustomAdapter Constructor *****************/
public DeviceList_Adapter(Activity a, ArrayList d)
{

    /********** Take passed values **********/
    activity = a;
    data=d;

    /***********  Layout inflator to call external xml layout () ***********/
    inflater = (LayoutInflater)activity.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

public int getCount() {

    if(data.size()<=0)
        return 1;
    return data.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent)
{

    View vi = convertView;
    ViewHolder holder;

    if(convertView==null){

        /****** Inflate listitem_device.xml file for each row ( Defined below ) *******/
        vi = inflater.inflate(R.layout.listitem_device, null);

        /******** Set Item Click Listner for LayoutInflater for each row *******/

        vi.setOnClickListener(new OnItemClickListener(position));
    }
    return vi;
}

@Override
public void onClick(View v) {
    Log.v("CustomAdapter", "=====Row button clicked=====");
}

/********* Called when Item click in ListView ************/
private class OnItemClickListener  implements View.OnClickListener {
    private int mPosition;

    OnItemClickListener(int position){
        mPosition = position;
    }

    @Override
    public void onClick(View arg0)
    {
        MainActivity mainActivity = (MainActivity)activity;

        /****  Call  onItemClick Method inside CustomListViewAndroidExample Class ( See Below )****/

        mainActivity.onItemClick(mPosition);
    }
}
}

Have a method called onItemClick() in the activity where you plan to use the listview. This method will be called each time a row is clicked on the listview.

Upvotes: 0

Vyacheslav
Vyacheslav

Reputation: 27211

If you use clickable buttons inside , I think, the best way is not to use AdapterView.OnItemClickListener but the usual onClick event. Or use android:descendantFocusability="blocksDescendants" I you wish your case.

Upvotes: 2

Vladimir Eremeev
Vladimir Eremeev

Reputation: 372

Maybe You set onClickListener in xml layout - remove this.

You can specify onClickListener for each list item view without ListView.setOnItemClickListener

Upvotes: 0

Related Questions