Domanda

Ho la seguente struttura nella mia app:

FragmentActivity con ViewPager tenendo frammenti multipli gestiti da FragmentStatePagerAdapter utilizzando compativility confezione con Android 2.1

Ogni frammento contiene ListView. Ogni elemento della ListView ha un LinearLayout con due TextViews e Button. Il LinearLayout e il pulsante hanno onClickListeners (separato). Cliccando sul LinearLayout inizia un'altra Activity. Ho notato che il comportamento scatti è molto incoerente: a volte viene eseguito immediatamente l'azione, ma molto spesso è in ritardo ed a volte è solo ignorato, non importa quante volte si tocca. Diventa ancora più strano perché posso toccare e l'azione viene eseguita solo quando inizio lo scorrimento della lista. Ho provato varie combinazioni di setFocusable(false) e setSelectable(true) ma sembra di non fare alcuna differenza. Qualche idea? Sarò lieto di fornire ulteriori dettagli.

È stato utile?

Soluzione 3

Nel caso in cui qualcuno si chiedeva come ho risolto questo. Fondamentalmente ho dovuto semplificare il mio layout. Sembra che quando si dispone di complesse strutture annidate eventi possono richiedere troppo tempo per bolla e se si avvia lista a scorrimento allo stesso evento tempo può innescare un'azione sbagliata. Ho tagliato i layout con il passaggio a RelativeLayout il più possibile e che sembrava aiutare molto

Altri suggerimenti

Ho avuto un problema simile e mi ci sono voluti 2 giorni per eseguire il debug e risolverlo. Ho un ListAdapter che crea diversi TextViews in un LinearLayout per ogni elemento della lista. Ogni TextView ha il proprio OnClickListener, perché ho bisogno di clic maniglia su ogni voce.

Quando ho cambiato l'attuazione in modo che io riutilizzare i Vista l'OnClickListener ha smesso di funzionare correttamente. Su 4.4.2 maggior numero di clic ha funzionato, ma a volte non c'era reazione fino a che non scorre nella lista. Sul 2.3 i primi scatti non sarebbe lavoro e poi tutti i clic in cui trattate in uno scoppio.

Nel mio caso particolare ho creato tutto il View in codice Java e non dalle risorse gonfiaggio. E il punto critico era che ho impostato i LayoutParams del LinearLayout anche quando la vista è stato riutilizzato (questo sembra essere più sicuri, assumendo quindi che la vista riutilizzato ha i parametri di layout corretti). Quando io non impostare la LayoutParams quando si riutilizza tutto funziona bene! Ecco il codice critica:

public View getView(int position, View convertView, ViewGroup parent) {
    LinearLayout tapeLine = null;
    if (convertView != null && convertView instanceof LinearLayout && ((LinearLayout)convertView).getChildCount() == 4) tapeLine = (LinearLayout) convertView; // Reuse view
    else tapeLine = new LinearLayout(activity);
    if (convertView == null) { // Don't set LayoutParams when reusing view
        ViewGroup.LayoutParams tapeLineLayoutParams = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        tapeLine.setLayoutParams(tapeLineLayoutParams);
    }
    ScrollingTape scrollingTape = calculatorHolder.getCalculator().getScrollingTape();
    int tapeWidthPx = parent.getWidth();
    TapeLineTextSizeInfo tapeLineTextSizeInfo = calculatorHolder.getTapeLineTextSizeHelper().createTapeLineTextSizeInfo(tapeWidthPx);
    ScrollingTapeLine line = scrollingTape.getLine(position);
    tapeLine.setOrientation(LinearLayout.HORIZONTAL);
    int tapeBackgroundColor = getBackgroundColor(line);
    tapeLine.setBackgroundColor(tapeBackgroundColor);
    addColumnViews(tapeLine, line, tapeLineTextSizeInfo);
    tapeLine.setTag(R.id.scrollingtapeadapter_viewtag_position, position);
    tapeLine.setOnLongClickListener(longClickListener);
    tapeLine.setOnClickListener(remainClickListener);
    return tapeLine;
}

Qual è il contesto di questo strano comportamento della visualizzazione elenco? Ho fatto un po 'di debug e la ricerca nelle fonti Android. Quando gli aggiornamenti di Android vista ci sono due passi importanti onMeasure e onLayout. Il metodo GetView del ListAdapter non solo è chiamato per disegnare la vista ma anche prima durante onMeasure. In questo caso, dopo la vista è stato creato, ma non è registrata presso la catena di eventi per gli eventi maniglia click.

Quando un punto di vista che è stato creato per onMeasure viene riutilizzato per poi essere acutally disegnato sullo schermo, deve essere registrati dal sistema Android per eventi maniglia click. Per questo caso particolare i develepers Android avevano fatto qualcosa, che potrebbe essere considerato come un hack sporco. Una bandiera speciale nei LayoutParams viene utilizzato per decidere che la vista deve essere registrato nel cambiamento manifestazione.

Ora il mio problema: reimpostando i LayoutParams anche quando la vista viene riutilizzato, questa bandiera è stata sempre azzerato. Pertanto il sistema Android non registrerebbe la vista e comunque non sarebbe venuto attraverso.

per riassumere:. Quando resusing una vista in GetView di una ListAdapter non sovrascrivere i LayoutParams perché tengono informazioni interne del sistema Android

Ho incontrato lo stesso problema, ma nel mio caso la soluzione è stata di non mantenere i riferimenti alle viste, che hanno causato problemi con la vista di caching di ListView. Dopo correttamente l'implementazione del metodo getView() con l'uso di converView, tutto strano comportamento con / chiamate click inaspettate perse non c'era più.

Che cosa ha funzionato per me è stato l'assegnazione di un OnItemClickListener alla ListView attraverso setOnItemClickListener, piuttosto che un OnClickListener alle singole voci di elenco. Ovviamente il pulsante ha ancora bisogno di un proprio OnClickListener, ma non ho ancora testato questo scenario.

Non sono sicuro se questo aiuta nessuno, ma ho avuto un problema simile, invece con un TableLayout. Le soluzioni di cui sopra non hanno risolto il mio problema.

Per me il problema era: android:animateLayoutChanges="true"

La rimozione di questo permesso miei clic sul pulsante dentro le mie righe TableLayout per funzionare correttamente. Ho dovuto quindi animate mie opinioni manualmente invece di basarsi sulla proprietà sopra.

Sembra che si sta eseguendo un certo processo di blocco (come invocare webservices o file di apertura) in filo di eventi, in modo che il filo evento è bloccato. Se questo è il caso, Si prega di elaborare il codice di blocco in un altro thread dai filati per eventi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top