标签: nestedrecyclerview

以编程方式将嵌套的 RecyclerView 滚动到某个位置

我知道如何以编程方式将回收器视图滚动到特定位置。但我的问题是我有一个带有垂直线性布局的回收器视图,它的每一行都有另一个子回收器视图网格布局。现在,当我以编程方式滚动父回收器视图时,它不会滚动到给定位置。但是,如果从中删除子回收器视图,那么它会毫无问题地滚动。这就是我尝试过的方法,并且对于单个回收器视图来说一切正常,行中没有子回收器视图。

card_recyclerView.getLayoutManager().scrollToPosition(position)
card_recyclerView.smoothScrollToPosition(position);
card_recyclerView.getLayoutManager().scrollToPositionWithOffset(position, 20);
Run Code Online (Sandbox Code Playgroud)

我的主要回收者视图

<androidx.recyclerview.widget.RecyclerView
                            android:id="@+id/card_recyclerView"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginRight="5dp"
                            android:clipToPadding="false"
                            android:layout_marginLeft="5dp"
                            android:background="#ffffff"
                            android:layout_weight="1"
                            />
Run Code Online (Sandbox Code Playgroud)

主要回收者视图行项目

                            <androidx.recyclerview.widget.RecyclerView
                            android:id="@+id/cards_recycler_adapter"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_below="@+id/layout_see_more_top"/>
Run Code Online (Sandbox Code Playgroud)

android scroll android-recyclerview nestedrecyclerview

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

如何在具有嵌套 RecyclerView 的多视图适配器上正确使用 RecycledViewPool?

我的应用程序上下文,以便您可以理解我的问题:

我目前正在编写一个非常复杂的应用程序,其中包含一个巨大的仪表板,其中包含大量嵌套的 RecyclerView(水平和垂直)。我知道垂直房车内的垂直房车是一种不好的做法,但不幸的是,这里的管理层和客户的要求比我们的建议更强烈,他们真的希望它得到实施。我们是如何获得垂直房车中的垂直房车的?我们的后端基本上提供了需要在仪表板内呈现的组的数组列表。基本上是服务器驱动的用户界面。这些组包含各种不同的设计、垂直子列表、水平子列表等。到目前为止,我已经成功地为这个 DashBoard 适配器构建了一个原型,现在我想更深入地了解性能优化。

我尝试过提高性能的事情:

我已经实现了 DiffUtil 来使仪表板在数据刷新时更有效地更新。我已将适配器设置为使用每个组都有的稳定 ID 和唯一的哈希值。我已经使用constraintLayout创建了平面UI,并且布局可能绝对最少。我已经使用了数据绑定,事实证明它实际上只提高了一点性能,而不仅仅是更好的干净代码。我绝对没有在适配器或 viewHolder 中进行任何数据处理,整个数据流具有来自更高数据层的最终形状。我已linearLayoutManager.initialPrefetchItemCount = x在每个嵌套 RV 上设置,其中 x 是在任何滚动之前在屏幕上呈现的项目数。

然后我遇到了 RecycledViewPool。我见过一些人们用这个技巧提高列表性能的例子。基本上,他们获取父大适配器的 recyclerViewPool 并将其设置在嵌套的 RV 上。我也实现了这个,我的大问题是现在我所有的嵌套项目都完全混淆了。

而不是像这样拥有三个水平房车:

在此输入图像描述

现在我把它们都混在一起了,如下所示:

在此输入图像描述

这是我的recycledViewPool实现:

class GlobalAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

private val groups: ArrayList<Group> = ArrayList()

private var recyclerViewPool = RecyclerView.RecycledViewPool()

[...]

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return when (viewType) {
        CATEGORIES_LIST.typeText.hashCode() -> {
            val holder = CategoryGroupViewHolder(
                DataBindingUtil.inflate(
                    LayoutInflater.from(parent.context),
                    R.layout.group_item_categories_list, parent, false
                ), adapterCallback
            )
            holder.binding.recyclerView.setRecycledViewPool(recyclerViewPool)
            holder
        }
     
        [...]
Run Code Online (Sandbox Code Playgroud)

所以我基本上将 viewPool …

android adapter kotlin android-recyclerview nestedrecyclerview

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

如何更新嵌套 recyclerview 项目的项目?

我有一个 recyclerview(parent),在片段中填充了一些 recyclerviews(child),我想使用操作(例如单击操作)直接从片段更新每个嵌套的 recyclerviews(child),我该如何在完美且高效的方式?

初始父适配器

     ParentAdapter adapter = new ParentAdapter(dataSet);
     mBinding.recyclerView.setAdapter(adapter);

Run Code Online (Sandbox Code Playgroud)

父适配器.java

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> {

    private final RecyclerView.RecycledViewPool viewPool;
    private List<CartItemCategory> dataSet;

    public MainAdapter(List<CartItemCategory> dataSet) {

        this.dataSet = dataSet;
        
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        ShoppingCardParentItemLayoutBinding mBinding = ShoppingCardParentItemLayoutBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
        return new ViewHolder(mBinding);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.mBinding.setCartItemCategory(dataSet.get(position));

        ChildAdapter childAdapter = new ChildAdapter(dataSet.get(position).getCartItems());
        holder.mBinding.recyclerView.setHasFixedSize(true);
        holder.mBinding.recyclerView.setAdapter(childAdapter);
        holder.mBinding.recyclerView.setRecycledViewPool(viewPool);
    }

    @Override
    public int getItemCount() {
        return dataSet.size();
    } …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview nestedrecyclerview

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

RecyclerView在ScrollView中不显示所有项目

RecyclerViewsLinearLayout里面有2 个ScrollView:

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="@dimen/few_value">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <com.foodjoo.fjco.customViews.BYekanFontText
            android:id="@+id/market_category"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:padding="@dimen/normal_plus_value"
            android:text=" ?????? > ????? ???? ???  "
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead"
            android:textColor="@color/light_black2" />

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

        <com.foodjoo.fjco.customViews.BYekanFontText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:padding="@dimen/normal_plus_value"
            android:text="????? ???"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead"
            android:textColor="@color/light_black2" />

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

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

两个回收商都有nestedScrollEnabledfla.

问题在于:当渲染布局时,第一个recyclerView将填充,屏幕底部的第二个recyclerView将不会显示所有项目,因为第一个高度!! 但它应该滚动,因为它们都在scrollView !!

所以有什么问题 ?

android android-layout android-recyclerview nestedrecyclerview

4
推荐指数
1
解决办法
2611
查看次数

嵌套 RecyclerView OnclickListener

我将 RecyclerView (MainRecyclerview 和 ChildRecyclerview)与两个适配器(MainRecyclerviewAdapter 和 ChildRecyclerviewAdapter)嵌套在一起,我创建了一个接口来处理 childRecyclerview 的点击,但我只能在 MainRecyclerviewAdapter 中访问该点击。我想知道如何处理 MainActivity 中 childRecyclerview 中项目的点击,谢谢。

这是我的代码:

//主要活动

公共类 MainActivity 扩展 AppCompatActivity {

List<Section> sectionList = new ArrayList<>();
RecyclerView mainRecyclerView;
LinearLayoutManager layoutManager;
MainRecyclerAdapter mainRecyclerAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile_properties);

    initData();
    initRecyclerView();



}
Run Code Online (Sandbox Code Playgroud)

}

//ChildRecyclerAdapter

公共类 ChildRecyclerAdapter 扩展 RecyclerView.Adapter<ChildRecyclerAdapter.ChildViewHolder> {

private final List<String> items;
private OnItemClickListener mListener;

public ChildRecyclerAdapter(List<String> items) {
    this.items = items;
}

public void setOnItemClickListener(OnItemClickListener listener) {
    mListener = listener;
}

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

android onclicklistener android-recyclerview nestedrecyclerview

2
推荐指数
1
解决办法
3853
查看次数

recyclerview 项目大小与布局中的大小不同

我正在尝试制作一个包含多个项目的嵌套回收器视图,在完成适配器和设计并进行测试后,我在模拟器中得到了这个

\n\n

在此输入图像描述\n在此输入图像描述

\n\n

我不明白为什么项目会这样出现,这些项目的高度和宽度与我为其布局设计而设计的高度和宽度不同。

\n\n

这是 recyclerview 设置的代码

\n\n
    mRecyclerView.setHasFixedSize(true);\n    adapter = new CheckoutMainRecyAdapter(CheckOutActivity.this, allSampleData);\n    mRecyclerView.setLayoutManager(new LinearLayoutManager(CheckOutActivity.this));\n    mRecyclerView.setAdapter(adapter);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是适配器代码

\n\n
public class CheckoutMainRecyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n    private ArrayList<CheckoutMainModel> dataList;\n    private Context mContext;\n\npublic CheckoutMainRecyAdapter(Context context, ArrayList<CheckoutMainModel> dataList) {\n    this.dataList = dataList;\n    this.mContext = context;\n\n}\n\n@Override\npublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {\n    View view;\n    switch (i) {\n        case Constants.type_checkout_address:\n            view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.checkout_address_item, null);\n            CheckoutMainRecyAdapter.AddressItemHolder mho = new CheckoutMainRecyAdapter.AddressItemHolder(view);\n            return mho;\n        case Constants.type_checkout_policy:\n            view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.checkout_policy_item, null);\n            CheckoutMainRecyAdapter.TermsItemHolder pro = new CheckoutMainRecyAdapter.TermsItemHolder(view);\n …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview nestedrecyclerview

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