Evento onClick no funciona en el control anidado de elementos de lista en android

Tengo 2 popups. En el primer popup tengo ListView con elementos seleccionables. Cuando hago clic en el elemento de la primera lista, aparece la segunda ventana emergente, que también tiene ListView con opciones para seleccionar.

He implementado primeros elementos de vista de lista como View personalizada y suscribiéndose a clics dentro del constructor de vista, así:

 class CustomListItem extends RelativeLayout{ public CustomListItem(){ ... //inflating stuff there ((Button)findViewById(R.id.listItemButton)).setOnClickListener( //This code not working as expected, but then could fire a lot of times v -> System.out.println("item clicked"); ); } } 

Cuando abro el primer cuadro de diálogo por primera vez, el manejador onClick activa como se espera y aparece el segundo mensaje emergente. Pero cuando cierro el segundo popup y vuelvo atrás (llamando a Dialog.dismiss() para popup) al primer popup, entonces el manejador onClick en el primer listview deja de funcionar. Hay algunas otras cosas de inetersting:

  1. onTouch escucha de onTouch para la vista de lista sigue funcionando (llamado action=ACTION_DOWN y action=ACTION_UP );
  2. Cuando se establece para listview onItemClickListener se llama siempre (1 vez cuando se abre popup y cuando volvemos a ella);
  3. Cuando hago clic muchas veces en el elemento en la vista de lista a veces onClick sucede y después de eso se llama tantas veces como he hecho clic antes.

¿Tiene alguna idea de cuál puede ser la razón del problema?

ACTUALIZAR

Parece que hay un problema con el método getView dentro del adaptador. He intentado crear un control personalizado de elemento de lista dentro de él (o lo obtengo de caché):

 @Override public View getView(int position, View view, ViewGroup parent) { if (!constructedViewCache.containsKey(position)) { constructedViewCache.put(position, new CustomListItem ()); } return constructedViewCache.get(position); } 

Cuando cambié este código al código siguiente todo funciona:

 @Override public View getView(int position, View view, ViewGroup parent) { if (view == null) { view = LayoutInflater.from(context).inflate(R.layout.list_view_item, null); } view.setOnClickListener(v -> { v -> System.out.println("item clicked"); }); return view; } 

¿Por qué no es posible crear vista con un new CustomListItem () ? O si es posible ¿cómo debo hacer eso?

Trate de insertar el atributo android:descendantFocusability="blocksDescendants" en la declaración de diseño principal del elemento de lista donde se coloca listItemButton .

Donde atributo android:descendantFocusability

Define la relación entre ViewGroup y sus descendientes cuando se busca una Vista para enfocar.

Y los blocksDescendants constantesDescendientes significa que:

ViewGroup bloqueará a sus descendientes de recibir el enfoque.

Segunda pregunta

Es posible crear vista con un nuevo CustomListItem (). Vea el ejemplo siguiente:

 @Override public View getView(int i, View view, ViewGroup viewGroup) { return new CustomListItem(context); } 

EDITAR

No vi su código completo, parece que usted es algo malo. Aquí está el ejemplo de funcionamiento echa un vistazo a:

 public class CustomAdapter extends BaseAdapter { private Context context; private HashMap<Integer, CustomListItem> constructedViewCache = new HashMap<>(); public CustomAdapter(Context context) { this.context = context; } @Override public int getCount() { return 20; } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int position, View view, ViewGroup viewGroup) { if (!constructedViewCache.containsKey(position)) { constructedViewCache.put(position, new CustomListItem(context, position)); } return constructedViewCache.get(position); } } 

Y segunda clase:

 public class CustomListItem extends RelativeLayout { private static final String TAG = "CustomListItem"; public CustomListItem(Context context, int position) { super(context); View view = LayoutInflater.from(context).inflate(R.layout.item_view, this); Button button = (Button) view.findViewById(R.id.button); button.setOnClickListener(view1 -> { Log.e(TAG, "CustomListItem: " + position ); FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager(); new CustomDialog().show(fragmentManager, "tag"); }); } } 

EDIT 2

He actualizado CustomListItem para mostrar el diálogo cuando se hace clic en el botón. Hay código de DialogFragment personalizado que está utilizando la lista de elementos mismo diseño y adaptador como actividad:

 public class CustomDialog extends DialogFragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_main, container, false); ListView listView = (ListView) view.findViewById(R.id.list); listView.setAdapter(new CustomAdapter(getActivity())); return view; } } 
  • Configuración de la posición de desplazamiento de ListView bien en Android
  • Android lista ver espacio extra al final cuando se desplaza
  • ¿Cómo puede inflar una presentación que contenga listview en un cuadro de diálogo de alerta?
  • ListView en la hoja inferior
  • Conexión de TextWatcher con un adaptador personalizado para filtrar texto a través de EditText
  • OnItemClickListener en un ListView dentro de un fragmento no funciona
  • Eliminación de elementos muliple de listview con la casilla de verificación en Android
  • cómo filtrar el listview personalizado en android
  • ListView.addFooterView () no funciona si no hay elementos en listview
  • Cómo insertar ListView en CardView con barra de desplazamiento fuera de CardView?
  • CheckedTextView no marca de selección de dibujo cuando se selecciona mediante programación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.