我正在尝试实现一个水平recyclerview,每个项目recyclerview将是一个垂直recyclerview的网格布局.我面临的问题是,当我尝试recyclerview垂直滚动子项时,父项recyclerview会抓取滚动并开始水平滚动.我尝试解决这个问题的方法是,
setNestedScrollingEnabled(false) 在父母身上 recyclerviewonTouch()孩子的recyclerview我recyclerview通过调用禁用父亲的触摸事件requestdisallowinterceptTouchevent(false)以上解决方案都没有为问题提供完美的解决方案.任何帮助表示赞赏
我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
在我的应用程序中,我有垂直父级,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) 我将开发足球应用程序,并跟随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) 我有一个带有多个视图的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
我有一个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) 我想实现一个像下图这样的 ConcatAdapter:
此页面的 recyclerView 包含以下元素:
但问题是,据我所知,我只能将一个 LayoutManager 设置为包含 ConcatAdapter 的 recyclerView 。
如何为每个适配器设置不同的布局管理器?或者任何其他解决方案来使用 CocantAdapter 实现此页面?
(为什么是ConcatAdapter?因为据我所知,即使使用recyclerViewPool,它也解决了nestedRecyclerView的性能问题)
android android-recyclerview nestedrecyclerview android-mergeadapter android-concatadapter
另一个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
我有一个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
我是 android kotlin 中分页 3 库的新手。我想要无限数据。所以我发现 Paging 3 库对我的情况很有帮助。我使用PagingSource创建了一个列表。我没有使用 Room。我嵌套了recyclerView。我正在将PagingDataAdapter与diff 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