Mick
Mick

Reputation: 7927

Making Listeners for buttons within a ListView

Copying other people's code that I only half understand, I have succeeded in making a listview, each element of which contains three TextViews and a CheckBox.

The code involves the following two xml files. First "customrowview.xml":

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="142dp"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
            <TextView android:id="@+id/text1"         

                android:layout_width="match_parent"         
                android:layout_height="fill_parent"/>
            <TextView android:id="@+id/text2"         

                android:layout_width="match_parent"         
                android:layout_height="fill_parent"/>
            <TextView android:id="@+id/text3" 

                android:layout_width="match_parent" 
                android:layout_height="wrap_content"/>

        </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="right" >



    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />
        <Button
            android:id="@+id/editbut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Edit" />
        </LinearLayout>
    </LinearLayout>



</LinearLayout>

Then "customlistview.xml":

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ListView android:id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#000fff"
    android:layout_weight="2"
    android:drawSelectorOnTop="false">
    </ListView>
<TextView  android:id="@id/android:empty"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFff00"
    android:text="No data"
    />
</LinearLayout>

I get access to the list via:

listView = (ListView) findViewById(R.id.mylist);

The code also involves:

    SimpleAdapter adapter = new SimpleAdapter(
            this,
            list,
            R.layout.custom_row_view,
            new String[] {"label","daysordate","time"},
            new int[] {R.id.text1,R.id.text3, R.id.text2}
            );
listView.setAdapter(adapter);

Now what I want to do is something like listView.setlistenerforbuttonwithinlist() !

But can not work out how to do it. I know there have been related questions on SO before, but I can not understand the answers :-(

EDIT: After seeing azgolfers answer... I made a custom adapter as follows:

public class myadapter extends SimpleAdapter
{
    LayoutInflater mLayoutInflater;


    public void myadapter(Context context) 
    {
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        View view = null;

        if (convertView != null)
        {
            view = convertView;
        } 
        else 
        {      
            view = mLayoutInflater.inflate(R.layout.custom_row_view, null);
        }

        Button buttonEdit = (Button) view.findViewById(R.id.editbut);

        buttonEdit.setOnClickListener(new OnClickListener()
        {   
            public void onClick(View arg0)
            {
                Log.i("xx","Button pressed!");
            }
        });

        return super.getView(position, convertView, parent);
    }

    public myadapter(Context context, List<? extends Map<String, ?>> data,int resource, String[] from, int[] to) 
    {
        super(context, data, resource, from, to);
        // TODO Auto-generated constructor stub
    }

}

Unfortunatly this crashes at the line

view = mLayoutInflater.inflate(R.layout.custom_row_view, null);

With a null pointer exception... not sure why :-(

Upvotes: 0

Views: 2778

Answers (2)

Ilya Demidov
Ilya Demidov

Reputation: 3305

try to сhange

 view = mLayoutInflater.inflate(R.layout.custom_row_view, null);

to

 view = mLayoutInflater.inflate(R.layout.custom_row_view, parent, false);

Good luck!

Upvotes: 1

azgolfer
azgolfer

Reputation: 15137

First, you need to extend your own Adapter, probably from an ArrayAdapter. ArrayAdapter has a method called getView that you will need to override and provide the UI for a listview row at a certain position. e.g.

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        if (convertView != null) {
            view = convertView;
        } else {
            view = mLayoutInflater.inflate(R.layout.custom_row_view, null);
        }
        Button buttonEdit = (Button) view.findViewById(R.id.editbut);
        buttonEdit.setOnClickListener(...);
    }

In getView(), since you are building the UI of the row, you have a chance here to set the click handler on your button.

Also, you also need to add this to your Button's xml tag:

android:focusable="false"
android:focusableInTouchMode="false" 

Without that, button inside a listview will not fire OnClick event when pressed.

Upvotes: 4

Related Questions