Onclicklistner no funciona en el listview de fragmentos

Tengo un listview con el adaptador de encargo en listfragment y también fijado onclicklistner para el listview. Pero Onclicklistner no funciona. Por favor alguien me ayude. Escucha mi código,

public class BasicFragment extends ListFragment { ListView lv; MyCustomAdapter adapter; @Override public void onCreate(Bundle si) { super.onCreate(si); } @Override public void onActivityCreated(Bundle b) { super.onActivityCreated(b); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_basic, container, false); lv = (ListView) view.findViewById(android.R.id.list); FetchedData DT = FetchedData.StaticDataTransfer(); RecepiesProperties[] AryObjaz = DT.getData(); getdata(AryObjaz); adapter = new MyCustomAdapter(getActivity(), R.layout.listview_layout, Dataset); lv.setAdapter(adapter); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub Toast t = Toast.makeText(getActivity(), "Message", Toast.LENGTH_SHORT); t.show(); } }); return view; }} 

MyCustomAdapter.java

 public class MyCustomAdapter extends ArrayAdapter<Recipes> { Context context; int layoutResourceId; Recipes data[] = null; Typeface typeface; public ImageLoader imageLoader; public MyCustomAdapter(Context context, int textViewResourceId, Recipes[] dataset) { super(context, textViewResourceId, dataset); this.layoutResourceId = textViewResourceId; this.context = context; this.data = dataset; imageLoader = new ImageLoader(context.getApplicationContext()); } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; LayoutInflater inflater = ((Activity) context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); RecipesHolder holder = new RecipesHolder(); holder.imgIcon = (ImageView) row.findViewById(R.id.imageView1); holder.txtTitle = (TextView) row.findViewById(R.id.title); holder.category = (TextView) row.findViewById(R.id.category); holder.source = (TextView) row.findViewById(R.id.source); holder.country = (TextView) row.findViewById(R.id.country); holder.readytime = (TextView) row.findViewById(R.id.readytime); holder.tips = (Button) row.findViewById(R.id.tips); holder.fav = (Button) row.findViewById(R.id.fav); Recipes ap = data[position]; imageLoader.DisplayImage(ap.getIMAGENAME240(), holder.imgIcon); holder.txtTitle.setText(ap.getNAME()); holder.category.setText(ap.getCATEGORY()); holder.source.setText(ap.getSOURCE()); holder.country.setText(ap.getCOUNTRY()); holder.readytime.setText(ap.getREADYTIME()); return row; } static class RecipesHolder { ImageView imgIcon; TextView txtTitle; TextView category; TextView source; TextView country; TextView readytime; Button tips; Button fav; }} 

//listview_layout.xml

 <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"><ImageView android:id="@+id/imageView1" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentLeft="true" android:focusable="true" android:layout_alignParentTop="true" android:layout_marginLeft="5dp" android:layout_marginTop="10dp" /> <TextView android:id="@+id/readytime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/country" android:layout_alignBottom="@+id/country" android:layout_marginLeft="73dp" android:layout_toRightOf="@+id/country" android:focusable="true" android:text="TextView" android:textColor="#000" /> <TextView android:id="@+id/country" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/imageView1" android:layout_alignLeft="@+id/source" android:focusable="true" android:text="TextView" android:textColor="#000" /> <TextView android:id="@+id/source" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/country" android:layout_alignLeft="@+id/category" android:focusable="true" android:text="TextView" android:textColor="#000" /> <TextView android:id="@+id/category" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/source" android:layout_alignLeft="@+id/title" android:text="TextView" android:focusable="true" android:textColor="#000" /> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/category" android:layout_toRightOf="@+id/imageView1" android:text="TextView" android:focusable="true" android:textColor="#000" /> <Button android:id="@+id/fav" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/tips" android:layout_below="@+id/source" android:focusable="true" android:background="@drawable/favourite" /> <Button android:id="@+id/tips" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignTop="@+id/textView1" android:layout_marginRight="14dp" android:background="@drawable/yellow" /></RelativeLayout> 

Finalmente resolvió el problema cuando todos los controles (botones, vistas de texto) en listview configurado para focusable false.

Compruebe su MyCustomAdapter, algún widget (como: Button, ImageButton) en el diseño personalizado consumirá el evento de clic y, a continuación, el onItemClick nunca se llamará.

Utilice el código siguiente en el método getView del adaptador para obtener el evento onClick.

  row.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); 

Según el Documento API de Android:

ListFragment tiene un diseño predeterminado que consiste en una vista de lista única. Sin embargo, si lo desea, puede personalizar el diseño del fragmento devolviendo su propia jerarquía de vista desde onCreateView (LayoutInflater, ViewGroup, Bundle). Para ello, la jerarquía de vistas debe contener un objeto ListView con el identificador "@android: id / list" (o lista si está en código)

Puesto que usted no fijó el archivo de la disposición para el fragmento no estoy seguro qué salió mal aquí. El código siguiente es cómo debe ser cuando está utilizando la vista de lista predeterminada de ListFragment. Si está utilizando el ListFragment debe aprovechar los métodos adicionales disponibles como setListAdapter y onListItemClick . Además, puede hacer lo mismo sin utilizar un ListFragment (utilizando sólo Fragment).

El código del fragmento (modificado su pedazo de código)

 public class BasicFragment extends ListFragment { MyCustomAdapter adapter; @Override public void onCreate(Bundle si) { super.onCreate(si); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // not sure what you are doing here but data fetch should be asynchronous if it interacts with DB or makes network call FetchedData DT = FetchedData.StaticDataTransfer(); RecepiesProperties[] AryObjaz = DT.getData(); getdata(AryObjaz); adapter = new MyCustomAdapter(getActivity(), R.layout.listview_layout, Dataset); setListAdapter(adapter); } @Override public void onListItemClick(ListView l, View v, int position, long id) { Toast t = Toast.makeText(getActivity(), "Message", Toast.LENGTH_SHORT); t.show(); } } 

Además, modifiqué el código del adaptador para ayudar a reciclar las vistas, su código actual no estaba utilizando el reciclado de la vista y siempre estaba inflando las vistas.

Código del adaptador:

 public class MyCustomAdapter extends ArrayAdapter<Recipes> { Context context; int layoutResourceId; Recipes data[] = null; Typeface typeface; public ImageLoader imageLoader; private LayoutInflater inflater; public MyCustomAdapter(Context context, int textViewResourceId, Recipes[] dataset) { super(context, textViewResourceId, dataset); this.layoutResourceId = textViewResourceId; this.context = context; this.data = dataset; imageLoader = new ImageLoader(context.getApplicationContext()); inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; RecipesHolder holder = null; //recycling views if(null == row){ row = inflater.inflate(layoutResourceId, parent, false); holder = new RecipesHolder(); holder.imgIcon = (ImageView) row.findViewById(R.id.imageView1); holder.txtTitle = (TextView) row.findViewById(R.id.title); holder.category = (TextView) row.findViewById(R.id.category); holder.source = (TextView) row.findViewById(R.id.source); holder.country = (TextView) row.findViewById(R.id.country); holder.readytime = (TextView) row.findViewById(R.id.readytime); holder.tips = (Button) row.findViewById(R.id.tips); holder.fav = (Button) row.findViewById(R.id.fav); row.setTag(holder); }else{ holder = (RecipesHolder)row.getTag(); } Recipes ap = data[position]; imageLoader.DisplayImage(ap.getIMAGENAME240(), holder.imgIcon); holder.txtTitle.setText(ap.getNAME()); holder.category.setText(ap.getCATEGORY()); holder.source.setText(ap.getSOURCE()); holder.country.setText(ap.getCOUNTRY()); holder.readytime.setText(ap.getREADYTIME()); return row; } static class RecipesHolder { ImageView imgIcon; TextView txtTitle; TextView category; TextView source; TextView country; TextView readytime; Button tips; Button fav; } } 

Ponga el código siguiente en el método onViewCreated() :

 @Override public void onViewCreated(View view, Bundle savedInstanceState) { ListView list = (ListView) view.findViewById(android.R.id.list); list.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast t = Toast.makeText(getActivity(), "Message", Toast.LENGTH_SHORT); t.show(); } }); } 

El problema puede estar en el hecho de que la vista no se construye todavía en onViewCreate (), por lo que no es recomendable establecer los oyentes allí.

Cuando usted está inflando sus puntos de vista, parece que su vista tiene 2 botones en ella:

Este row.findViewById(R.id.tips);

Y este row.findViewById(R.id.fav);

Usted debe quitar estos botones (substituirlos por las vistas de texto si usted no quiere su tecleo)

O si desea los clics de estos botones, puede utilizar OnClickListeners para cada botón y otro OnClickListener para toda la vista.


EJEMPLO

 @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; //we only inflate if the row is null!! if(row == null) { LayoutInflater inflater = ((Activity) context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); RecipesHolder holder = new RecipesHolder(); holder.imgIcon = (ImageView) row.findViewById(R.id.imageView1); holder.txtTitle = (TextView) row.findViewById(R.id.title); holder.category = (TextView) row.findViewById(R.id.category); holder.source = (TextView) row.findViewById(R.id.source); holder.country = (TextView) row.findViewById(R.id.country); holder.readytime = (TextView) row.findViewById(R.id.readytime); holder.tips = (Button) row.findViewById(R.id.tips); holder.fav = (Button) row.findViewById(R.id.fav); //we set the tag of the view to this holder so we can get it everytime row.setTag(holder); } //change this to final so that you can use it inside your click listeners final Recipes ap = data[position]; //here we get the holder of the view from its tag RecipesHolder holder = (RecipesHolder) row.getTag(); //no changes to ur setup imageLoader.DisplayImage(ap.getIMAGENAME240(), holder.imgIcon); holder.txtTitle.setText(ap.getNAME()); holder.category.setText(ap.getCATEGORY()); holder.source.setText(ap.getSOURCE()); holder.country.setText(ap.getCOUNTRY()); holder.readytime.setText(ap.getREADYTIME()); //now the click listeners //tips button holder.tips.setOnClickListener(new OnClickListener() { public void onClick(View v) { //tips has been clicked //do whatever you want with `ap` } }); //fav button holder.fav.setOnClickListener(new OnClickListener() { public void onClick(View v) { //fav has been clicked //do whatever you want with `ap` } }); //whole item click row.setOnClickListener(new OnClickListener() { public void onClick(View v) { //the row has been clicked //do whatever you want with `ap` } }); return row; } 
 @Override public void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); } 
  lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //your code } }); 

Creo que esto debería funcionar

El adaptador tiene el método areAllItemsEnabled (), podría ser útil.

Public abstract boolean areAllItemsEnabled ()

Indica si todos los elementos de este adaptador están habilitados. Si el valor devuelto por este método cambia con el tiempo, no hay garantía de que surtirá efecto. Si es verdad, significa que todos los elementos son seleccionables y se puede hacer clic (no hay separador).

Sólo android:focusable="false" android:clickable="false" poner android:focusable="false" android:clickable="false" en el diseño. Para todas las vistas de texto, botones, etc. Problema resuelto.

Tuve un problema similar, me tomó un tiempo muy largo para averiguar lo que estaba mal. Anteriormente mi onListItemClick del fragmento () abrió una nueva actividad, pero después de volver al fragmento el oyente onListItemClick () no trabajó más.

 @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // additional code (eg open new activity) } 

Este problema se resolvió creando un oyente dentro de mi ArrayAdapter personalizado en su lugar. Coloqué este código dentro de getView ():

  rowView.setOnClickListener(new View.OnClickListener() { final int p = position; @Override public void onClick(View v) { Log.d("FeedListAdapter", "onClick()"); openPost(p); // for example } }); 

Me he quedado toda la noche arreglando esto (es 8 am), pensé que debería publicar mi solución para cualquier otra persona que está en un lugar similar 🙂

  • Adaptador personalizado que no muestra ningún dato en ListView
  • ¿Cómo actualizar la lista de adaptadores personalizados al instante en Android?
  • Eliminación de un elemento de ListView dentro de un adaptador personalizado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.