标签: nestedrecyclerview

嵌套的RecyclerView.如何在子级RecyclerView滚动时阻止父级RecyclerView滚动?

我正在尝试实现一个水平recyclerview,每个项目recyclerview将是一个垂直recyclerview的网格布局.我面临的问题是,当我尝试recyclerview垂直滚动子项时,父项recyclerview会抓取滚动并开始水平滚动.我尝试解决这个问题的方法是,

  1. setNestedScrollingEnabled(false) 在父母身上 recyclerview
  2. onTouch()孩子的recyclerviewrecyclerview通过调用禁用父亲的触摸事件requestdisallowinterceptTouchevent(false)

以上解决方案都没有为问题提供完美的解决方案.任何帮助表示赞赏

android android-recyclerview nestedrecyclerview

28
推荐指数
6
解决办法
2万
查看次数

Recyclerview同时绑定所有视图

GridLayoutManager在另一个Recyclerview(with LinearLayoutManager)中有一个垂直的Recyclerview(带有a ).我现在面临的问题是,内部的recyclerview(使用GridLayoutManager)同时绑定它的所有项目,甚至是当前不在屏幕上的视图(onBindViewHolder()被调用所有项目).

为了给你提供更多信息,在我的布局文件中,我把我的Recycler视图的高度设置为wrap_content.

我认为问题是,因为有2个嵌套的垂直回收视图,当父RV想要测量它的子节点并且子节点是另一个RV时,onMeasure()它计算整个RV所需的大小,而不仅仅是它想要绑定的部分屏幕上.

不知道怎么解决这个问题?

这是我的外部recyclerview的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
    android:id="@+id/component_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

以下是我的内部回收者视图的代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/gutter"
android:paddingBottom="@dimen/gutter">

<TextView
    android:id="@+id/title_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="@dimen/gutter"
    android:textSize="30sp"
    android:textColor="@android:color/white"
    android:fontFamily="sans-serif-thin"/>

<android.support.v7.widget.RecyclerView
    android:id="@+id/my_slider"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

PS:我正在使用此适配器委托进行外部回收查看:https: //github.com/sockeqwe/AdapterDelegates

android gridlayoutmanager android-recyclerview nestedrecyclerview

17
推荐指数
2
解决办法
2990
查看次数

嵌套的RecyclerView滚动问题

在我的应用程序中,我有垂直父级,RecyclerView其中包含很少的水平子级ViewHolders.但我有非常烦人的滚动问题 - 在我垂直滚动父RV之后我想滚动我的一个孩子RV但父母只是拦截所有的动作事件,直到我从屏幕上移开我的手指然后把它放回去.这是令人讨厌的行为的例子.

https://i.imgur.com/dPtmAXD.gif

我尝试了这个问题的每个解决方案 - 嵌套的RecyclerView.如何在子级RecyclerView滚动时阻止父级RecyclerView滚动?

什么都不适合我.

看起来Google Play Market具有相同的RV层次结构,但是滚动非常好.我试图从其他主题实现一些解决方案,但没有任何工作按预期.

我不知道我应该发布什么代码,但这里是我的父RV的ViewHolder示例与嵌套RV.

private class UserEventsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private RecyclerView rvUserEvents;
        private HomeUserEventsRVAdapter rvAdapter;

        public UserEventsViewHolder(View v) {
            super(v);

            rvUserEvents = v.findViewById(R.id.rv_user_events);
            rvUserEvents.setLayoutManager(new LinearLayoutManager(itemView.getContext(), LinearLayoutManager.HORIZONTAL, false));
            rvUserEvents.setNestedScrollingEnabled(false);
            rvUserEvents.setRecycledViewPool(viewPool);
            rvAdapter = new HomeUserEventsRVAdapter(presenter);
            rvUserEvents.setAdapter(rvAdapter);

            v.findViewById(R.id.btn_all_user_events).setOnClickListener(this);
        }

        private void bind(UserItemViewModel userItem) {
            rvAdapter.updateAdapter(userItem);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_all_user_events:
                    presenter.openUserEventsList();
                    break;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:我的活动的XML代码

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cl_root"
android:layout_width="match_parent" …
Run Code Online (Sandbox Code Playgroud)

android scroll android-recyclerview nestedrecyclerview

13
推荐指数
1
解决办法
2084
查看次数

如何在android中的相同recyclerview中填充具有相同字段或属性的不同对象

我将开发足球应用程序,并跟随json响应.(链接)

我有两个不同的类,具有不同的名称,但具有相同的属性或字段,并希望显示一个相同的单一RecyclerView.

在这里,我有worldmatch和世界具有类似于相同的字段matchTime,startTime以及endTime.我使用jsontopojo插件创建了pojo类.

这是主要的事情,我想显示worldmatch在0位置,并根据俱乐部的其他位置世界其他地区.您可以在图片中查看更多详细信息.

在此输入图像描述

在此输入图像描述

这必须是第一个标签(世界),类似于欧洲,亚洲等具有相似模式的其他标签.

TAB1(世界)

---------------position 0 (All match)------------------
|
| 930   1100   1130  and so on ( horizontal recyclerview)
|
-------------------------------------------
---------------position 1(Barcelona)------------------
|
| 1130   1230   1330   1430  and so on (  horizontal recyclerview)
|
-------------------------------------------
---------------position 2(Chelsea)------------------
|
| 1300   1400   1500  and so on (  horizontal recyclerview)
|
-------------------------------------------
                     .
                     .
                     .
                   so on
        (vertical …
Run Code Online (Sandbox Code Playgroud)

java android android-recyclerview nestedrecyclerview

10
推荐指数
1
解决办法
452
查看次数

嵌套的RecyclerView与多视图滞后滚动

我有一个带有多个视图的recyclerView,其中每一行都是recyclerView.当我滚动recyclelerView时,在创建的每一行上都是滞后的.这是我的一些代码.在下面你可以看到main recyclerView的配置:

LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
    mRvPromotions.setLayoutManager(mLayoutManager);
    mRvPromotions.setItemViewCacheSize(20);
    mRvPromotions.setDrawingCacheEnabled(true);
    mRvPromotions.setHasFixedSize(true);
    mRvPromotions.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    mRvPromotions.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

你可以在下面看到在适配器中绑定的内部recyclerView的代码:

mRvPromotion.setLayoutManager(new GridLayoutManager(itemView.getContext(), 3));
    mRvPromotion.setItemViewCacheSize(20);
    mRvPromotion.setDrawingCacheEnabled(true);
    mRvPromotion.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    adapter = new PlaylistPromotionsRVAdapter(new PlaylistModelCallBack(), new PlaylistPromotionVHFactory());
    mRvPromotion.setAdapter(adapter);
    adapter.submitList(getVM().getPlaylist());
Run Code Online (Sandbox Code Playgroud)

我用mRvPromotion.setNestedScrollingEnabled(false);ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);,但laggy行为存在的钢.对于加载图像,我使用了Fresco并调整了配置.如何防止滞后滚动?

编辑

这是我的适配器:

public class PlaylistRVAdapter extends ListAdapter<PlayListPromotionAndSlider, BaseViewHolder> {

private final PlaylistPageVHFactory mFactory;
private final PublishSubject<PlaylistSliderVHAction> mClickSliderPS = PublishSubject.create();
private final PublishSubject<PlaylistPromotionsVHAction> mClickPromotionPS = PublishSubject.create();

@Inject
PlaylistRVAdapter(@NonNull PlaylistPromotionModelCallBack diffCallback, PlaylistPageVHFactory factory) {
    super(diffCallback);
    mFactory = factory;
}

@NonNull
@Override
public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup …
Run Code Online (Sandbox Code Playgroud)

android recycler-adapter android-recyclerview fresco nestedrecyclerview

6
推荐指数
1
解决办法
961
查看次数

smoothScrollToPosition在嵌套的RecyclerView中不起作用

我有一个recyclerView,每个项目都是一个recyclerView。我想在特定条件下滚动到内部recyclerView的自定义位置。我在innerRecyclerView上使用了这段代码,但是没有用:

innerRecyclerView.smoothScrollToPosition(position); 
Run Code Online (Sandbox Code Playgroud)

和这个:

innerRecyclerView.scrollToPosition(position); 
Run Code Online (Sandbox Code Playgroud)

还有这个:

layoutManager.scrollToPositionWithOffset(position, offset);
Run Code Online (Sandbox Code Playgroud)

现在我有两个问题:

1)是否可以滚动到内部recyclerView的自定义位置?

2)如果可能的话,怎么办?

这是初始化主recyclerView:

LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false);
        adapter = new FreightsListRVAdapter(new FreightListCallBack(), new FreightListVHFactory());
        rvFreightsList.setLayoutManager(layoutManager);
        rvFreightsList.setItemViewCacheSize(30);
        rvFreightsList.setNestedScrollingEnabled(true);
        rvFreightsList.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

这是初始化innerRecyclerview:

LinearLayoutManager layoutManager = new LinearLayoutManager(itemView.getContext(), RecyclerView.VERTICAL, false);
        layoutManager.setItemPrefetchEnabled(true);
        layoutManager.setInitialPrefetchItemCount(7);
        rvFreights.setNestedScrollingEnabled(false);
        rvFreights.setLayoutManager(layoutManager);
        rvFreights.setItemViewCacheSize(20);

        adapter = new FreightsRVAdapter(new FreightCallBack(), new FreightSingleVHFactory());
        rvFreights.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

这是我的主要recyclerView适配器:

public class FreightsListRVAdapter extends ListAdapter<FreightListModel, FreightListVH> {

    private final FreightListVHFactory mFactory;
    private final PublishSubject<FreightListVHAction> mClickUserPS = PublishSubject.create();

    @Inject
    public FreightsListRVAdapter(@NonNull FreightListCallBack diffCallback, FreightListVHFactory factory) {
        super(diffCallback);
        mFactory = factory; …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview nestedrecyclerview

6
推荐指数
1
解决办法
388
查看次数

ConcatAdapter 中的多个 LayoutManager

我想实现一个像下图这样的 ConcatAdapter:

在此输入图像描述

此页面的 recyclerView 包含以下元素:

  • 标题
  • 水平recyclerView(带分页)
  • 标题
  • 垂直recyclerView(无分页)
  • 标题
  • 水平recyclerView(带分页)

但问题是,据我所知,我只能将一个 LayoutManager 设置为包含 ConcatAdapter 的 recyclerView 。

如何为每个适配器设置不同的布局管理器?或者任何其他解决方案来使用 CocantAdapter 实现此页面?

(为什么是ConcatAdapter?因为据我所知,即使使用recyclerViewPool,它也解决了nestedRecyclerView的性能问题)

android android-recyclerview nestedrecyclerview android-mergeadapter android-concatadapter

6
推荐指数
1
解决办法
2449
查看次数

Recycler视图内部的Recycler视图不滚动

另一个Recycler View内部有一个Recycler View,两者都需要垂直滚动。外部回收站视图正确滚动,但内部回收站视图不滚动。

这是代码:

LinearLayoutManager mLayoutManager = new LinearLayoutManager(ViewActivity.this);
outerRecyclerView.setLayoutManager(mLayoutManager);
ViewAdapter adapter = new ViewAdapter(ViewActivity.this);
outerRecyclerView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

ViewAdapter如下:

public void onBindViewHolder(ViewAdapter.ViewViewHolder holder, int position)
{
  //RECYCLER VIEW
  //TODO: Inner Recycler view scroll movement
  LinearLayoutManager mLayoutManager = new LinearLayoutManager(context);
  holder.protocolRecyclerView.setLayoutManager(mLayoutManager);
  ViewProtocolAdapter adapter = new ViewProtocolAdapter(context);
  holder.protocolRecyclerView.setAdapter(adapter);
}
Run Code Online (Sandbox Code Playgroud)

我已经在两个回收站视图上尝试了以下方法,但无法解决问题

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
       @Override
       public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
           if(rv.getChildCount() > 0) {
               View childView = rv.findChildViewUnder(e.getX(), e.getY());
               if(childView ==listView) {
                   int action = e.getAction();
                   switch (action) {
                       case MotionEvent.ACTION_DOWN:
                           rv.requestDisallowInterceptTouchEvent(true);
                   } …
Run Code Online (Sandbox Code Playgroud)

android vertical-scrolling android-recyclerview nestedrecyclerview

5
推荐指数
2
解决办法
6919
查看次数

在嵌套的RecyclerViews中保持滚动位置

我有一个ViewHolder包含另一个RecyclerView.这种类型的ViewHolder多次重复使用.

由于ViewHolder在不同项之间RecyclerView共享,因此在项之间也共享滚动位置.例如,您滚动到第一个项目的末尾,第五个项目的RecyclerView也会滚动到最后,因为视图被重用.

我试图通过映射1 ViewHolder到1项来解决这个问题.

我试过设置一个itemId项目,调用RecyclerView.ViewHolder #setIsRecyclable(false),并RecyclerView.getRecycledViewPool().setMaxRecycledViews()按照这个答案中的提到进行扩展/设置

向下滚动并向上滚动(ViewHolder获得回收)后,内部RecyclerView的滚动位置将重置为第一个项目.

android android-viewholder android-recyclerview nestedrecyclerview

5
推荐指数
0
解决办法
593
查看次数

更新当前页面或更新分页 3 库中的数据 Android Kotlin

我是 android kotlin 中分页 3 库的新手。我想要无限数据。所以我发现 Paging 3 库对我的情况很有帮助。我使用PagingSource创建了一个列表。我没有使用 Room。我嵌套了recyclerView。我正在将PagingDataAdapterdiff util用于我的 Recyclerview。我使用了codelab推荐的分页库教程我成功了,没有任何问题。我面临更新项目的困难。我使用分页源创建列表,在列表中我有一些来自服务器的数据。我完全没有任何问题。但是如何更新适配器或通知数据在 reyclerview 中发生了变化。我已经有机制来获取更新的列表。我搜索了如何在某个地方更新适配器,但每个地方都提到使用来自DataSource 的invalidate()数据源用于分页 2对吗?现在,根据Migrate to Paging 3 中的文档,这是在Paging 3 中。我使用 Flow 来检索数据。此代码位于viewmodel类中。

fun createRepo(data: List<String>, repository: RepositoryData): Flow<PagingData<UnlimitData>> {
    return repository.getStreamData(data).cachedIn(viewModelScope)
}
Run Code Online (Sandbox Code Playgroud)

我正在传递来自服务器的列表。getStreamData函数返回带有 int 和 string 数据的项目。我的数据类

data class UnlimitData(val id: Int, val name: String)
Run Code Online (Sandbox Code Playgroud)

createRepo正在调用我的活动类以在 Adpater 中发送数据。

lifecycleScope.launch {
        viewModel.createRepo(serverData,repository).collectLatest …
Run Code Online (Sandbox Code Playgroud)

android kotlin nestedrecyclerview android-paging-library android-paging-3

5
推荐指数
1
解决办法
3152
查看次数