【问题标题】:Problem with RecyclerView, moves to the last positionRecyclerView 出现问题,移动到最后一个位置
【发布时间】:2019-06-08 17:05:34
【问题描述】:

我是一个带有自定义适配器的 recyclerView。在这一刻,我有七个项目。第一次打开活动时,我的 recyclerView 显示在第一个元素中,但如果我出去然后返回,它位于最后一个元素中。似乎可以自动滚动。

奇怪的是(不知道是不是必须做的)是我在日志中放了一行,在GetItemViewType方法中,第一次打开,我得到这个:

 D/POSITION(30978): 0
 E/POSITION(30978): 0
 D/POSITION(30978): 1
 E/POSITION(30978): 1
 D/POSITION(30978): 0
 E/POSITION(30978): 0
 D/POSITION(30978): 1
 E/POSITION(30978): 1
 D/POSITION(30978): 0
 E/POSITION(30978): 0
 D/POSITION(30978): 1
 E/POSITION(30978): 1

当我出去又回来时,我得到了这个:

 D/POSITION(30978) : 0
 E/POSITION(30978) : 0
 D/POSITION(30978) : 1
 E/POSITION(30978) : 1
 D/POSITION(30978) : 1
 E/POSITION(30978) : 1
 D/POSITION(30978) : 4
 E/POSITION(30978) : 4
 D/POSITION(30978) : 4
 E/POSITION(30978) : 4
 D/POSITION(30978) : 5
 E/POSITION(30978) : 5
 D/POSITION(30978) : 6
 E/POSITION(30978) : 6
 D/POSITION(30978) : 7
 E/POSITION(30978) : 7
 D/POSITION(30978) : 3
 E/POSITION(30978) : 3
 D/POSITION(30978) : 3
 E/POSITION(30978) : 3
 D/POSITION(30978) : 4
 E/POSITION(30978) : 4
 D/POSITION(30978) : 5
 E/POSITION(30978) : 5
 D/POSITION(30978) : 6
 E/POSITION(30978) : 6
 D/POSITION(30978) : 7
 E/POSITION(30978) : 7

我的布局是:

<MvxRecyclerView
     android:clipToPadding="false"
     android:id="@+id/myRecyclerView"
     android:focusable="false"
     android:layout_height="match_parent"
     android:layout_width="match_parent"
     android:scrollbars="vertical" />

我的活动:

protected override void OnViewModelSet()
{
     SetContentView(Resource.Layout.myActivity);
     _recyclerViewAdapter = new ClassRecyclerViewAdapter((IMvxAndroidBindingContext)BindingContext);
     _recyclerView = FindViewById<MvxRecyclerView>(Resource.Id.myRecyclerView);
     _recyclerView.HasFixedSize = true;
     _recyclerView.Adapter = _recyclerViewAdapter;
     _recyclerView.ViewTreeObserver.AddOnScrollChangedListener(this);
}

还有我的适配器:

public class ClassRecyclerViewAdapter : MvxRecyclerAdapter
{
     public ClassRecyclerViewAdapter(IMvxAndroidBindingContext bindingContext)
            : base(bindingContext) => HasStableIds = true;

     public override int GetItemViewType(int position) 
     {
          Mvx.IoCProvider.Resolve<ILogger>().LogMessage("POSITION", position.ToString());
          return ViewTypeFactory.ViewType((MyItems)GetItem(position));
      }

     public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
      {
          var bc = new MvxAndroidBindingContext(parent.Context, BindingContext.LayoutInflaterHolder);
          return ViewHolderFactory.ViewType(viewType, parent, bc);
      }

      public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
      {
          base.OnBindViewHolder(holder, position);
          var holder = holder as ItemViewHolder;
          holder.Bind();
      }

      public override long GetItemId(int position)
      {
          var fi = (MyItems)GetItem(position);
          return fi.Id;
       }
}

我需要总是在第一个元素中显示我。

有什么想法吗?

感谢您的 cmets。

【问题讨论】:

  • 嘿@jmlg 你提到“但是如果我出去再进去,它会定位在最后一个元素中”。你能解释一下吗?你是说如果你退出应用再打开应用,页面会滚动到视图底部并选择最后一个元素?
  • 嗨@Saamer。谢谢你的兴趣。当我说“但是如果我出去再进去,它位于最后一个元素中”,这意味着在屏幕上的回收视图中,我按下我的后退按钮,这会将我带到另一个有按钮的屏幕,我按我的按钮返回recyclerview,它会自动下降到recyclerview的最后一项,它总是呈现在最后一个位置。
  • 在你的 OnResume 中,在 base.OnResume(); 之后你能试试 recyclerView.SmoothScrollToPosition(0);或 1. 或者在该页面上的所有内容加载后使用该行。

标签: c# xamarin mvvmcross


【解决方案1】:

SmoothScrollToPosition(int position) 滚动以在屏幕底部显示该项目。

你可以使用:

 ScrollToPositionWithOffset(int position, int offset) 

offset=0。然而,这并不顺利。

我不确定您是否可以扩展 RecyclerView 以提供类似 SmoothScrollToPositionFromTop(int position) 的功能,例如可用在 AbsListView 中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多