2012-08-22 15 views
13

Ho più HorizontalScrollViews all'interno di uno ScrollView. Lo scorrimento orizzontale non è affatto fluido. Devo scorrere quasi perfettamente orizzontalmente per far scorrere il lavoro. C'è una soluzione semplice per modificare questo ??? Grazie!Android: HorizontalScrollView all'interno di ScrollView

Multiple HorizontalScrollViews inside a single ScrollView

+0

Sto cercando di ottenere un'interfaccia utente simile. Tuttavia, la mia scrollview non è liscia e si blocca durante lo scorrimento. Hai affrontato problemi simili nel tuo progetto? Grazie! – gauravsapiens

+0

Hai onClickListener()? – vladexologija

+0

Sì, all'interno dell'adattatore di HorizontalListView! – gauravsapiens

risposta

7

È possibile utilizzare vista Recycler con sfalsati gestore di layout

StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.HORIZONTAL); 

RecyclerViewAdapter recyclerViewAdapter = newRecyclerViewAdapter(this); 

recyclerView.setAdapter(recyclerViewAdapter); //Don't miss to initialize your adapter 
+0

Mi dispiace, penso che l'url sia sufficiente? –

+3

@yousefsafwat ** No ** ... un collegamento è * mai * sufficiente. È necessario pubblicare le parti importanti di una risposta qui, su questo sito. –

+0

L'idea è di mettere listview orizzontale all'interno listview verticale –

0

In generale, non si dovrebbe usare ScrollViews annidati in Android a tutti, il comportamento di scorrimento in questo modo è innaturale troppo.

Si consiglia di ripensare la progettazione del layout, è tutto ciò che non è possibile ottenere con un elenco espandibile?

+0

Se al 100% siete fermamente convinti di ciò, date un'occhiata alla soluzione in: http://stackoverflow.com/questions/2646028/android-horizontalscrollview-within-scrollview-touch-handling?rq= 1 – Guykun

+0

Sto provando a implementare questo modello: http://www.androidpatterns.com/uap_pattern/scrollable-rows – vladexologija

2

Ho trovato la soluzione e ancora non riesco a credere che questo è quello che devi fare per rendere questo lavoro normale! Appena aggiunto onClickListener vuoto alla ciascun elemento della HorizontalScrollView:

item.setOnClickListener(new OnClickListener() {   
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
     } 
    }); 

Dopo questa diapositiva è davvero liscia, sia verso l'alto e verso il basso.

+1

se questo è il caso, puoi probabilmente inserire 'android: clickable =" true "' nella tua voce di elenco root XML, anziché nel codice. – ataulm

4

Questa classe crea una ScrollView contenente un HorizontalScrollView combinato in una classe. Puoi mettere cose al suo interno usando il metodo AddChild(). Il dispatchTouchEvent overide mantiene lo scorrimento scorrevole in modo da poter scorrere con un solo vetrino del dito.

(di recente ho usato questo per avvolgere una TextView di programmazione creato)

class MultiScrollView extends ScrollView 
{   
public HorizontalScrollView hscroll; 

public MultiScrollView (Context context) 
{ 
    super(context); 
} 

public void AddChild(View child) 
{            
    hscroll.addView(child); 
} 

@Override 
public boolean dispatchTouchEvent(MotionEvent event) 
{ 
    hscroll.dispatchTouchEvent(event); 
    onTouchEvent(event); 
    return true; 
} 
} 
+0

David milioni grazie funziona come un incanto. –

2

Se si utilizza la soluzione di visualizzazione di scorrimento orizzontale da (http://www.dev-smart.com/archives/34) la soluzione per il problema di fuoco incrociato tra la vista di scorrimento e la vista elenco sta bloccando lo stato attivo su scroll view dopo aver messo a fuoco la visualizzazione elenco.

Da un punto di vista tecnico è necessario aggiungere la seguente riga alla funzione onScroll all'interno della classe HorizontalListView.

getParent().requestDisallowInterceptTouchEvent(true); 

Spero che questo aiuti.

0

Mentre la risposta di David funziona, ha un aspetto negativo. Passa l'oggetto MotionEvent di ScrollView direttamente a HorizontalScrollView.onTouchEvent(), quindi se HorizontalScrollView oi suoi figli cercano di ottenere le coordinate dell'evento, otterranno le coordinate sbagliate basate su ScrollView.

La mia soluzione:

public class CustomScrollView extends ScrollView{ 

    /*************skip initialization*************/ 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent e){ 
     //returning false means ScrollView is not interested at any events, 
     //so ScrollView's onTouchEvent() won't be called, 
     //and all of the events will be passed to ScrollView's child 
     return false; 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     //manually call ScrollView's onTouchEvent(), 
     //the vertical scrolling happens there. 
     onTouchEvent(ev); 
     //dispatch the event, 
     //ScrollView's child will have every event. 
     return super.dispatchTouchEvent(ev); 
    } 
} 

Basta avvolgere questo CustomScrollView intorno al HorizontalScrollView nel file di layout.

Problemi correlati