2010-10-24 12 views
6

Ecco lo scenario concettualmente (esclusi linearlayouts)problemi di scorrimento con un controllo ListView all'interno di uno ScrollView

ScrollView 
    Button 
    Checkboxes 
    Spinner 
    ListView (full-size, non-scrolling) 
AdMob advert 

cioè un riquadro a scorrimento, che ha un'interfaccia utente di filtraggio in alto, seguita da risultati, ma l'annuncio deve sempre rimanere visibile e quando scorri verso il basso l'interfaccia utente del filtro deve scorrere lontano, lasciando il massimo spazio per i risultati.

Sono consapevole che ci sono problemi con un ListView all'interno di un ScrollView, anche se per me funziona bene in molti modi (sto fissando la lunghezza del ListView per impedirne il crollo). Quindi lo schermo scorre bene, l'annuncio rimane in fondo, e sembra buono.

Ma il problema che sto vedendo è, inspiegabilmente, quando si apre l'attività, il ScrollView è sceso un po ', quindi il ListView è nella parte superiore dello schermo. Presumo che questo è un comportamento di default, così mi sono messo a cercare di forzare la posizione di scorrimento del ScrollView verso l'alto, ma ho provato vari metodi, e vedo nessun effetto:

scrollview.scrollTo(0, 1000/-1000); 
scrollview.smoothScrollBy(0, 1000/-1000); 
scrollview.fullScroll(View.FOCUS_UP); 

C'è un modo per forzare ScrollView per iniziare con la posizione di scorrimento in alto?

In caso contrario, come posso avere un annuncio che non scorre dal basso, ma un'interfaccia utente del filtro che scorre sempre dall'alto? Usare ListView sembra eccessivo, perché non ho bisogno di scorrere ma offre molti vantaggi, quindi sarebbe bello evitare di ricominciare da zero e di rendere tutto da solo.

+0

Qualsiasi soluzione reale per questo problema? – Tony

+0

Questa non è una buona pratica da fare, ma se si tenta di dare altezza a listview su runtime di quanto sia possibile. vedi sotto link: - http://stackoverflow.com/questions/3495890/how-can-i-put-a-listview-into-a-scrollview-without-it-collapsing/3495908#3495908 – duggu

risposta

0

Perché stai utilizzando un listview se non stai scorrendo? Perché non puoi semplicemente usare un linearlayout o qualcosa di più adatto a questa situazione? Hai menzionato un filtro, potresti facilmente arrotolare il tuo filtro specialmente perché apparentemente hai solo alcuni elementi nella tua lista.

+0

Sto riempiendo il ListView da un adattatore, e non posso farlo con un LinearLayout. Gli elementi in ListView sono dinamici e sarei sicuramente molto interessato a sapere cosa funzionerebbe meglio in sostituzione di ListView, quindi risolvo il problema di scorrimento, ma mantengo i vantaggi di ListView, come l'associazione dei dati e il riutilizzo degli elementi. Avrebbe senso sostituire il ListView con un AdapterView? –

+0

È possibile creare un adattatore e non associarlo semplicemente a listview – Falmarri

+0

A cosa dovrei associarlo? –

0

Utilizzare qualcosa di diverso da ListView, è possibile generare dinamicamente linearLayouts per mostrare i dati desiderati. Non dovresti mai usare un listview all'interno di una scrollView, non funziona per un semplice motivo, quando scorri, cosa dovrebbe scorrere, la listview o la scroll. Un paio di persone di google hanno dichiarato di non farlo.

+0

Certo, ho capito che usare un controllo a scorrimento all'interno di un controllo a scorrimento è una cattiva notizia (dal punto di vista dell'interfaccia utente, figuriamoci dell'implementazione) ma in uno scenario in cui ListView non ha barre di scorrimento, queste limitazioni hanno meno senso. –

+0

Come stai garantendo che il listview non scorra? – Falmarri

+0

Il fatto che non scorra indica che non ci sono molti dati da mostrare, quello era il mio ragionamento principale per pensare che avrebbe dovuto avere una vista elenco. – blindstuff

0

Ho riscontrato il problema di una ScrollView che iniziava a scorrere leggermente verso il basso, la soluzione consisteva nel pubblicare un runnable che chiamava il metodo animateTo (0,0) per far scorrere la lista verso l'alto. Ho trovato che funziona solo usando anitmatTo (0,0) scrollTo (0,0) non sembra funzionare.

Qualcosa sulla falsariga di:

mListView.post(new Runnable(){ public void run() { mListView.animateScrollTo(0,0) }); 

Ora, come tutti hanno già detto non si deve fare tutto il ListView all'interno di uno ScrollView, ma questo può essere una soluzione per il problema di avere.

+0

Ripensandoci dopo alcuni mesi, la risposta a ciò che stavo cercando di fare sembra piuttosto ovvia: l'intestazione di ListView. Non avrei mai dovuto scorrere all'interno dello scrolling, ma avevo bisogno di un ListView e altre cose per scorrere come un grumo, e il ListView ha già tutto ciò che contiene. Facile perdere queste cose quando le interfacce pubbliche sono così grandi su alcune classi Android. –

1

Utilizzare il seguente metodo e buon divertimento!

private void setListViewScrollable(final ListView list) { 
    list.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      listViewTouchAction = event.getAction(); 
      if (listViewTouchAction == MotionEvent.ACTION_MOVE) 
      { 
       list.scrollBy(0, 1); 
      } 
      return false; 
     } 
    }); 
    list.setOnScrollListener(new OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(AbsListView view, 
       int scrollState) { 
     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 
      if (listViewTouchAction == MotionEvent.ACTION_MOVE) 
      { 
       list.scrollBy(0, -1); 
      } 
     } 
    }); 
} 

listViewTouchAction è un valore intero globale. Se è possibile sostituire la linea

list.scrollBy(0, 1); 

con qualcos'altro ti invitiamo a condividere con noi.

0

ho:

ScrollView 
TextView 
Button 
TextView 
ListView 

e questo lavoro per me:

scrollView.smoothScrollBy(0, 0);   

senza questo inizio vista dalla posizione di ListView, dopo di che inizia da cima

-1

La soluzione per questo problema è di mettere a fuoco una richiesta su un oggetto nella parte superiore di ScrollView. Ad esempio è possibile utilizzare un layout di tabella che racchiude il pulsante e richiede il focus al layout della tabella (se si mette a fuoco il pulsante cambierà il suo colore).

// onCreate method 
TableLayout tablelayout = (TableLayout) findViewById(R.id.tablelayout); 
tablelayout.setFocusableInTouchMode(true); 
tablelayout.requestFocus(); 
Problemi correlati