Pra Kash
Pra Kash

Reputation: 33

Custom ListView with button

I using custom adapter for displaying a list of items in my project, Right now it is working fine.but now i got another requirement that i need to put a button on each item. If put the button like that then the onItemClickListenter() for that item is not working ,instead onClickListener() for that button is working.

But according to my context both onClickListenter() for button and onItemClickListener() for that item should work.Can somebody please help me if know the technique.

Thanks in advance.

Upvotes: 0

Views: 1408

Answers (3)

Pra Kash
Pra Kash

Reputation: 33

rather than putting buttons on row use image views as many required and set on click listener to them, Since imageViews are not focusable

Upvotes: 0

Kaushik
Kaushik

Reputation: 6162

As Button is a focusable view thats why onItemClick isn't work. In ur_row.xml (where you placed that Button) add these attributes inside Button tag

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

Inside your CustomAdapter's getView(...) set onClickListener for that Button this will fire both onItemClick for ListView and onClick for Button.

Upvotes: 2

MSA
MSA

Reputation: 2482

You need a custom adapter:

This project contains 4 parts:

1.MainActivity

public class MainActivity extends Activity {

private ListView listView;
private CustomAdapter customAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_activity);

    init();
}

/**
 * Init Data
 */
public void init(){
    List<String> listItems = new ArrayList<String>();
    for(int i=0;i<10;i++) {
        listItems.add("Test" + i);
    }
    listView = (ListView)findViewById(R.id.listView);
    customAdapter = new CustomAdapter(MainActivity.this,R.layout.row_item,listItems);
    listView.setAdapter(customAdapter);
}
}

2.MainActivity layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".main_activity">

<ListView
    android:id="@+id/listView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

</RelativeLayout>

3.CustomAdapter

public class CustomAdapter extends ArrayAdapter<String> {

private Context context;
private TextView itemListText;
private Button itemButton;
private List<String> listValues;


public CustomAdapter(Context context, int resource, List<String> listValues) {
    super(context, resource,listValues);
    this.context = context;
    this.listValues = listValues;
}

/**
 * getView method is called for each item of ListView
 */
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    String currentValue = listValues.get(position);

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.row_item, null);

    itemListText = (TextView)convertView.findViewById(R.id.itemListText);
    itemListText.setText(currentValue);

    itemListText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context,"Text Working",Toast.LENGTH_SHORT).show();
        }
    });

    itemButton = (Button)convertView.findViewById(R.id.itemButton);
    //To lazy to implement interface
    itemButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context,"Button Working",Toast.LENGTH_SHORT).show();
        }
    });

    return convertView;
}
}

4.Row Item layout

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

<TextView
    android:id="@+id/itemListText"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="Select Text"
    android:gravity="center_vertical"
    android:layout_weight="0.7"/>

<Button
    android:id="@+id/itemButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Push me"
    />

</LinearLayout>

Output:

TextView touch action

enter image description here

Button touch action

enter image description here

Upvotes: 0

Related Questions