He aquí un ejemplo de un botón que se puede hacer clic dentro de un ListView. Si desea descargar el proyecto se puede descargar el proyecto de IntelliJ Gradle de mi sitio web: http://developersfound.com/ListButtonClickExample.zip
El adaptador personalizado en este ejemplo tiene el oyente clic en lugar del oyente dentro del fragmento o actividad. Está hecho de tal manera que solo está en el objeto detector y todos los botones están ligados a ellos por eficiencia.
Este es el diagrama ListItem:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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="com.jc_systems.listbuttonclickexample.app.ItemFragment">
<LinearLayout
android:id="@+id/test_container"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image_list_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/exaple_icon"
android:layout_weight=".1"
android:layout_gravity="left|top"/>
<TextView
android:id="@+id/lbl_list_item"
android:layout_width="168dp"
android:layout_height="wrap_content"
android:text="I think this should take up two lines..."
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:gravity="center_vertical|center_horizontal"
android:layout_gravity="center_vertical"/>
<Button
android:id="@+id/cmd_list_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello"
android:layout_weight="0.2"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:paddingTop="0dp"
android:paddingBottom="0dp"
android:layout_gravity="right|top"/>
</LinearLayout>
</FrameLayout>
Y aquí es el CustomAdapter:
import android.app.Activity;
import android.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class MyCustomAdapter extends ArrayAdapter {
private final ArrayList<FragmentItems> list;
private static Activity context;
private View.OnClickListener adaptrDynaListener = null;
public MyCustomAdapter(Activity context, ArrayList<FragmentItems> list) {
super(context, R.layout.fragment_items, list);
this.context = context;
this.list = list;
adaptrDynaListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
String buttonText = ((Button) v).getText().toString();
new AlertDialog.Builder(MyCustomAdapter.context).setTitle("Alert").setMessage(buttonText).setNeutralButton("OK", null).show();
}
};
}
static class ViewHolder {
protected ImageView image_list_image;
protected TextView lbl_list_item;
protected Button cmd_list_button;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
ViewHolder viewHolder = new ViewHolder();
if (convertView == null) {
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate(R.layout.fragment_items, null);
viewHolder.image_list_image = (ImageView) view.findViewById(R.id.image_list_image);
viewHolder.lbl_list_item = (TextView) view.findViewById(R.id.lbl_list_item);
viewHolder.cmd_list_button = (Button) view.findViewById(R.id.cmd_list_button);
viewHolder.cmd_list_button.setTag(viewHolder);
view.setTag(viewHolder);
}
else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.lbl_list_item.setText(list.get(position).getMessage());
holder.cmd_list_button.setText(list.get(position).getButtonText());
holder.cmd_list_button.setOnClickListener(adaptrDynaListener);
return view;
}//public View getView(int position, View convertView, ViewGroup parent)
public int getCount() {
if(list.size() <= 0) {
return 1;
}
return list.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
}
He probado este patrón adaptador bastante extensamente y parece muy estable en ListView, ListActivities y ListFragments .
Aparentemente necesita 'android: focusable =" false "' para el botón. Esta pregunta es bastante común aquí – Raffaele