2012-08-22 19 views
13

Ich habe mehrere HorizontalScrollViews innerhalb einer ScrollView. Horizontal Scroll ist überhaupt nicht glatt. Ich muss fast perfekt horizontal scrollen, um zur Arbeit zu scrollen. Gibt es eine einfache Lösung, um dies zu ändern? Vielen Dank!Android: HorizontalScrollView innerhalb ScrollView

Multiple HorizontalScrollViews inside a single ScrollView

+0

Ich versuche, eine ähnliche Benutzeroberfläche zu erreichen. Meine Scrollansicht ist jedoch nicht glatt und friert beim Scrollen ein. Hatten Sie in Ihrem Projekt ähnliche Probleme? Vielen Dank! – gauravsapiens

+0

Haben Sie onClickListener()? – vladexologija

+0

Ja, im Adapter von HorizontalListView! – gauravsapiens

Antwort

7

Sie können mit Versetzte Layout-Manager von

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

RecyclerViewAdapter recyclerViewAdapter = newRecyclerViewAdapter(this); 

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

Es tut mir leid, ich denke, die URL ist genug? –

+3

@yousefsafwat ** Nein ** ... ein Link ist * nie * genug. Sie müssen die wichtigen Teile einer Antwort hier auf dieser Seite veröffentlichen. –

+0

Die Idee horizontal Listenansicht ist innerhalb vertikaler Listenansicht –

0

Im Allgemeinen sollten Sie keine verschachtelten ScrollViews in Android verwenden überhaupt, das Verhalten auf diese Weise zum Scrollen zu unnatürlich ist.

Sie möchten vielleicht Ihr Layout-Design überdenken, ist es etwas, das mit einer erweiterbaren Liste nicht erreicht werden könnte?

+0

Wenn Sie jedoch 100% ig darüber sind, werfen Sie einen Blick auf die Lösung in: http://StackOverflow.com/Questions/2646028/android-horizontalscrollview-within-Scrollview-Touch-Handling?RQ= 1 – Guykun

+0

Ich versuche, dieses Muster zu implementieren: http://www.androidpatterns.com/uap_pattern/scrollable-rows – vladexologija

2

Ich habe die Lösung gefunden und kann immer noch nicht glauben, dass dies ist, was Sie tun müssen, um diese Arbeit normal zu machen! Just added leer OnClickListener auf die einzelnen Elemente in der HorizontalScrollView:

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

Nachdem diese Folie wirklich glatt ist, nach oben und unten.

+1

Wenn das der Fall ist, können Sie wahrscheinlich 'android: clickable =" true "' in Ihrem Listenelement root XML statt im Code. – ataulm

4

Diese Klasse erstellt eine ScrollView, die eine in einer Klasse zusammengefasste HorizontalScrollView enthält. Mit der AddChild() -Methode können Sie Objekte darin platzieren. Das DispatchTouchEvent Overide hält den Bildlauf weich, so dass Sie mit einem einzigen Fingerrutschen schwenken können.

(I verwendet, um diesen vor kurzem eine programmatisch erstellt Textview wickeln)

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 Millionen Dank es funktioniert wie Charme. –

2

Wenn Sie die horizontalen Scroll-View-Lösung verwenden, verwenden Recycler Ansicht (http://www.dev-smart.com/archives/34) die Lösung für das Querfokusproblem zwischen der Bildlaufansicht und der Listenansicht blockiert den Fokus auf die Bildlaufansicht Sobald Sie sich auf die Listenansicht konzentriert haben.

Aus technischer Sicht sollten Sie die folgende Zeile zur onScroll-Funktion innerhalb der HorizontalListView-Klasse hinzufügen.

getParent().requestDisallowInterceptTouchEvent(true); 

Hoffe, das hilft.

0

Während Davids Antwort funktioniert, hat es einen Nachteil. Es übergibt das MotionEvent-Objekt von ScrollView direkt an HorizontalScrollView.onTouchEvent(). Wenn also HorizontalScrollView oder seine untergeordneten Objekte versuchen, die Ereigniskoordinaten abzurufen, erhalten sie die falschen Koordinaten, die auf ScrollView basieren.

Meine Lösung:

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); 
    } 
} 

einfach wickeln diese CustomScrollView um die HorizontalScrollView in Ihrem Layout-Datei.

Verwandte Themen