在我们的应用程序中,我们有一个RecyclerView,它在水平列表中显示大型项目。我们使用LinearLayoutManager来做到这一点。当用户滚动屏幕时会出现此问题。当下一个大项目需要出现在屏幕上时,UI将被冻结。
我们想要实现的是对RecyclerView项的某种延迟加载。因此,与facebook的实现类似,用户看到了一个存根,一旦他停止滚动,UI就会更新以显示实际内容。
问题是-正确的扩展点是什么?我应该实现自定义LayoutManager吗?还是有解决办法?
发布于 2015-08-12 21:03:58
如果您使用Xamarin作为您的标记,那么可以这样做:
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);
}
}
}若要在视图中使用此方法,请使用:
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;
}发布于 2015-08-04 19:29:27
不知道你在做什么,我只能提出一个高层次的建议。该建议是将滚动监听器附加到recyclerView。
这对你有什么用?
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;
}
}
});我想补充的是,如果您正在加载图像,请查看毕加索图书馆
来自毕加索的网页:
适配器下载
自动检测到适配器的重用,并取消先前的下载。
@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);
}https://stackoverflow.com/questions/31816866
复制相似问题