2016-12-15 18 views
1

Ich mache App, wo ich recyclerView verwende, um mit Bildern umzugehen. Ich muss die Liste der Bilder oft aktualisieren (3 Sek.), Aber nach dem Update - Scroll geht nach oben. recyclerView zu aktualisieren verwende ich diesen Code:Position des ausgewählten Elements in RecyclerView nach Aktualisierung speichern [Xamarin.Android]

adapter = new ImageAdapter(this, DrawableList); 
RunOnUiThread(() => recyclerView.SetAdapter(adapter)); 

Gibt es eine Möglichkeit Position blättert in RecyclerView oder die Aktualisierung im Hintergrund zu retten?

+0

In Java haben wir eine Methode aktuelle scrollX und Scrolly als 'recyclerView.getScrollX()' und 'recyclerView.getScrollY() erhalten', wenn Sie diese Werte speichern, Sie können 'recycleView.scrollTo (x, y)' verwenden, um zur alten Position zu blättern. –

+0

Funktioniert nicht: C – bigjoe1

Antwort

2

Ich muss die Liste der Bilder oft aktualisieren (3 Sek.), Aber nach dem Update - Scroll geht nach oben.

Ich denke, es ist möglich, Sie wollen einfach nur Ihre RecyclerView halten bis zum Ende gescrollt werden, wenn Sie Ihre Bilder aktualisieren, dann können Sie einfach folgenden Code:

adapter = new ImageAdapter(imageAlbum); 
recyclerView.SetAdapter(adapter); 
recyclerView.ScrollToPosition(adapter.ItemCount - 1); 

Wenn Sie blättern möchten an die spezifische Position, wenn Sie Ihre Bilder aktualisieren, gibt es keine aktuelle Api für jetzt, nicht wie die Standard Android API, ScrollToPositionWithOffset ist eine virtuelle Methode in Xamarin.Android, können wir nur zu dem bestimmten Element im Adapter mit RecyclerView.ScrollToPosition oder LinearLayoutManager.ScrollToPosition scrollen . Auch gibt es keine vorhanden API für das erste sichtbare Element in Xamarin.Android bekommen, müssen wir unsere LinearLayoutManager die von LinearLayoutManager Klasse erben schaffen und solche Methoden außer Kraft setzen wir müssen verwenden, zum Beispiel:

public class MyLinearLayoutManager : LinearLayoutManager 
{ 
    public MyLinearLayoutManager(Context context) : base(context) 
    { 
    } 

    public override int FindFirstVisibleItemPosition() 
    { 
     return base.FindFirstVisibleItemPosition(); 
    } 

    public override void ScrollToPositionWithOffset(int position, int offset) 
    { 
     base.ScrollToPositionWithOffset(position, offset); 
    } 
} 

Jetzt sind wir scrollen wie Standard-Android auf die spezifische Position:

scrollListener = new MyOnScrollListener(); 
... 

var item = rvManager.FindFirstVisibleItemPosition(); 
adapter = new ImageAdapter(imageAlbum); 
rv.SetAdapter(adapter); 
//offset value 200 is fake, you can calculate by yourself 
rvManager.ScrollToPositionWithOffset(item, 200); 
Verwandte Themen