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í:
- Configuración de la tarea asincrónica para cargar Json en una vista de lista
- Android - ListView con imágenes se desplaza demasiado lento incluso sin ningún procesamiento en el método getView del adaptador
- Deshabilitar el desplazamiento en la vista de lista
- Cómo detectar si un listview está desplazándose hacia arriba o hacia abajo en android?
- ¿Cómo conectar una aplicación de Android a una base de datos remota?
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:
-
onTouch
escucha deonTouch
para la vista de lista sigue funcionando (llamadoaction=ACTION_DOWN
yaction=ACTION_UP
); - Cuando se establece para listview
onItemClickListener
se llama siempre (1 vez cuando se abre popup y cuando volvemos a ella); - 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?
- Problema de menú emergente en Android ListView
- Cómo obtener los elementos de la lista seleccionada de un Listview con checkBox y Adaptador personalizado?
- OnContextItemSelected no parece ser llamado
- Imagen que se muestra en Android Studio pero no en el teléfono
- SwipeRefreshLayout interferir con setOnScrollListener
- ¿Por qué la aplicación Android de Facebook se desplaza tan suavemente
- Cómo borrar un Android ListView y llenarlo con nuevos datos?
- Reemplazar un fragmento con otro en ViewPager
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; } }
- WebView se estrella al cargar vídeos para Android 7.0
- Ignorar el artefacto de la API de Android com.google.android:android:2.2.1 para depurar / liberar