2016-12-15 133 views
1

我正在制作应用程序,我正在使用recyclerView来处理图像。我必须经常更新图像列表(3秒),但在更新之后 - 滚动将会最高。 要更新recyclerView我用这个代码:更新后在RecyclerView中保存所选项目的位置[Xamarin.Android]

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

有什么办法来保存RecyclerView滚动的位置或在后台更新?

+0

在Java中,我们有一个方法来获得当前scrollX和scrollY为'recyclerView.getScrollX()'和'recyclerView.getScrollY()'如果保存这些值,你可以使用'recyclerView.scrollTo(x,y)'滚动到旧的位置。 –

+0

不工作:C – bigjoe1

回答

2

我必须经常更新图像列表(3秒),但更新后 - 滚动将顶部。

我认为当你更新你的形象有可能你只是想保持你的RecyclerView滚动以结束,那么你可以简单地这样的代码:

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

如果要滚动到更新图片时的具体位置,目前没有现在的Api,不像标准Android API,ScrollToPositionWithOffset是Xamarin.Android中的虚拟方法,我们只能使用RecyclerView.ScrollToPositionLinearLayoutManager.ScrollToPosition滚动到适配器中的特定项目。也有是获得在Xamarin.Android第一个可见项目不存在API,我们需要建立我们LinearLayoutManagerLinearLayoutManager类继承并重写这些方法,我们可能需要使用,例如:

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

现在我们可以滚动到像标准Android的具体位置:

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); 
相关问题