2015-08-22 21 views
29

Mam fragment, w którym znajduje się RecyclerView z LinearLayoutManager, w którym znajdują się elementy CardView. Po kliknięciu znajduje się przycisk akcji, którego elementy powinny przewijać się do góry. Próbowałem używać scrollToPosition, a także scrollToPositionWithOffset z RecyclerView, a także z LinearLayoutManager, jak pokazano poniżej. Ale to nie ma żadnego efektu. Dlaczego tak jest? Czy ktoś może mi pomóc?Przewiń do góry w RecyclerView z LinearLayoutManager

I umieściłem RecyclerView bezpośrednio wewnątrz pliku SwipeRefreshView w pliku xml. Dzwonię pod numer setFloatingActionButton, gdy tylko ustawi się adapter na RecyclerView.

public void setFloatingActionButton(final View view) { 
    float = (android.support.design.widget.FloatingActionButton) getActivity().findViewById(R.id.float); 
    float.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
    mRecyclerView.smoothScrollToPosition(0); 


      android.support.design.widget.Snackbar.make(view, "Scrolled to Top", android.support.design.widget.Snackbar.LENGTH_SHORT) 
        .setAction("Ok", new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          LinearLayoutManager llm = (LinearLayoutManager) mRecyclerView.getLayoutManager(); 
          llm.scrollToPosition(0); 

         } 
        }) 
        .setActionTextColor(getActivity().getResources().getColor(R.color.coloLink)) 
        .show(); 
     } 
    }); 
} 
+0

Spróbuj 'mLayoutManager.scrollToPositionWithOffset (0, 0);' – Antrromet

+0

tak próbowałem to .Ale to nie ma wpływu zbyt podobnie jak scrollToPosition. – SRBhagwat

+0

To dziwne, bo nawet ja miałem podobny układ jak twój. Miałem 'RecyclerView' z menedżerem layoutu i to było umieszczone w' SwipeRefreshview', i to działało dla mnie. – Antrromet

Odpowiedz

69

Kontynuując z powyższych uwag, idealnie, zastępując

mRecyclerView.smoothScrollToPosition(0); 

w onClick pływającego przycisku akcji z

mLayoutManager.scrollToPositionWithOffset(0, 0); 

powinno działać. Możesz również usunąć kod SnackBar, ponieważ i tak go nie potrzebujesz. Tak więc, w sumie swojej powyższej metody powinny wyglądać

public void setFloatingActionButton(final View view) { 
    float actionButton = (android.support.design.widget.FloatingActionButton) getActivity() 
      .findViewById(R.id.float); 
    actionButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView 
        .getLayoutManager(); 
      layoutManager.scrollToPositionWithOffset(0, 0); 
     } 
    }); 
} 

A jeśli mówisz, że powyższe nie robi praca, a następnie sprawdzić, czy onClick() jest nawet nazywany też nie. Spróbuj dodać wiadomość do dziennika i sprawdź, czy jest wydrukowana.

+0

Tak, faktycznie dostałem to, usuwając połączenia z innych fragmentów do tej metody. Bezpośrednio umieściłem tworzenie fab w metodzie onCreate(). Teraz działa całkiem dobrze. – SRBhagwat

+0

Dziękuję. Pomogło :) – SRBhagwat

+0

A z snackbarem nie działa. To dobrze, bo nie ma potrzeby snackbar. – SRBhagwat

3

nazywamy 'scrollToPosition (0)' przy użyciu to:

public void scrollToPosition(final int position) { 
    if (mRecyclerView != null) { 
     getHandler().post(new Runnable() { 
      @Override 
      public void run() { 
       mRecyclerView.scrollToPosition(position); 
       if (position == 0) { 
        LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager(); 
        layoutManager.scrollToPositionWithOffset(0, 0); 
        mScrollView.fullScroll(View.FOCUS_UP); 
       } 
      } 
     }); 
    } 
} 
+0

Co to jest mScrollView ..? – david

+0

prywatny NestedScrollView mScrollView; –

3

Stosując metodę smoothScrollToPosition() pracował dla mnie z najnowszej wersji Androida.

layoutManager.smoothScrollToPosition(mRecyclerView, null, 0); 
Powiązane problemy