首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型项目的RecyclerView

大型项目的RecyclerView
EN

Stack Overflow用户
提问于 2015-08-04 18:42:44
回答 2查看 1.8K关注 0票数 0

在我们的应用程序中,我们有一个RecyclerView,它在水平列表中显示大型项目。我们使用LinearLayoutManager来做到这一点。当用户滚动屏幕时会出现此问题。当下一个大项目需要出现在屏幕上时,UI将被冻结。

我们想要实现的是对RecyclerView项的某种延迟加载。因此,与facebook的实现类似,用户看到了一个存根,一旦他停止滚动,UI就会更新以显示实际内容。

问题是-正确的扩展点是什么?我应该实现自定义LayoutManager吗?还是有解决办法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-12 21:03:58

如果您使用Xamarin作为您的标记,那么可以这样做:

代码语言:javascript
复制
public class  XamarinRecyclerViewOnScrollListener : RecyclerView.OnScrollListener
{
    public delegate void LoadMoreEventHandler(object sender, EventArgs e);
    public event LoadMoreEventHandler LoadMoreEvent;

    private LinearLayoutManager LayoutManager;

    public XamarinRecyclerViewOnScrollListener (LinearLayoutManager layoutManager)
    {
        LayoutManager = layoutManager;
    }

    public override void OnScrolled (RecyclerView recyclerView, int dx, int dy)
    {
        base.OnScrolled (recyclerView, dx, dy);

        var visibleItemCount = recyclerView.ChildCount;
        var totalItemCount = recyclerView.GetAdapter().ItemCount;
        var pastVisiblesItems = LayoutManager.FindFirstVisibleItemPosition();

        if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
            LoadMoreEvent (this, null);
        }
    }
}

若要在视图中使用此方法,请使用:

代码语言:javascript
复制
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        var view = base.OnCreateView(inflater, container, savedInstanceState);

        var recyclerView = view.FindViewById<RecyclerView>(Resource.Id.my_recycler_view);
        if (recyclerView != null)
        {
            recyclerView.HasFixedSize = true;

            var layoutManager = new LinearLayoutManager(Activity);

            var onScrollListener = new XamarinRecyclerViewOnScrollListener (layoutManager);
            onScrollListener.LoadMoreEvent += (object sender, EventArgs e) => {
                //Load more stuff here
            };

            recyclerView.AddOnScrollListener (onScrollListener);

            recyclerView.SetLayoutManager(layoutManager);
        }
        return view;
    }
票数 2
EN

Stack Overflow用户

发布于 2015-08-04 19:29:27

不知道你在做什么,我只能提出一个高层次的建议。该建议是将滚动监听器附加到recyclerView。

这对你有什么用?

代码语言:javascript
复制
        final int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
    final int lastVisiblePosition = layoutManager.findLastVisibleItemPosition();

    myRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
        }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);

            switch (newState) {
                case RecyclerView.SCROLL_STATE_IDLE:
                    for (int i = firstVisiblePosition; i <= lastVisiblePosition; i++) {
                        // start content loading here
                        recyclerView.getChildAt(i).loadMyContent;
                    }
                    break;
                case RecyclerView.SCROLL_STATE_DRAGGING:
                    for (int i = firstVisiblePosition; i <= lastVisiblePosition; i++) {
                        // cancel content loading here
                        recyclerView.getChildAt(i).cancelLoad;
                    }
                    break;
                case RecyclerView.SCROLL_STATE_SETTLING:
                    // you could load content here, but it could end up off screen by the time it stops, so I would not recommend it
                    break;
            }
        }
    });

我想补充的是,如果您正在加载图像,请查看毕加索图书馆

来自毕加索的网页:

适配器下载

自动检测到适配器的重用,并取消先前的下载。

代码语言:javascript
复制
@Override public void getView(int position, View convertView, ViewGroup parent) {
  SquaredImageView view = (SquaredImageView) convertView;
  if (view == null) {
    view = new SquaredImageView(context);
  }
  String url = getItem(position);

  Picasso.with(context).load(url).into(view);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31816866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档