更新后保存所选项目在RecyclerView中的位置[Xamarin.Android]

时间:2016-12-15 11:10:26

标签: android image xamarin android-recyclerview

我正在使用recyclerView处理图片的应用。我必须经常更新图像列表(3秒)但更新后 - 滚动到顶部。 要更新recyclerView,请使用以下代码:

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

有没有办法在RecyclerView中保存滚动位置或在后台更新?

1 个答案:

答案 0 :(得分:3)

  

我必须经常更新图像列表(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,我们需要创建继承自LinearLayoutManager类的LinearLayoutManager并覆盖我们可能需要使用的方法,例如:< / p>

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