简体   繁体   English

Recyclerview内部的Recyclerview无法平滑滚动

[英]Recyclerview inside Recyclerview not scrolling smooth

I have a vertical Recyclerview(parent) inside it has three rows. 我有一个垂直的Recyclerview(parent)里面有三行。 Each row as RecyclerView(child1),RecyclerView(child2),RecyclerView(child3), Each of them with different type of layoutmanager like child1 has gridLayout manager,child2 & 3 has Vertical LinearLayout manager. 每行分别为RecyclerView(child1),RecyclerView(child2),RecyclerView(child3),每行具有不同类型的layoutmanager,例如child1具有gridLayout管理器,child2&3具有Vertical LinearLayout管理器。

So each row there is different type of adapters when i set them in rows. 因此,当我将它们设置为行时,每一行都有不同类型的适配器。 But problem is occured when i am scrolling recyclerview. 但是,当我滚动recyclerview时出现问题。 It is not smooth scrolling also it takes 700ms around to visible second row. 滚动不流畅,大约需要700毫秒左右才能看到可见的第二行。

My row_list_item layout is: 我的row_list_item布局是:

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

    <LinearLayout
        android:id="@+id/ll_main_block"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:orientation="horizontal"
            android:paddingLeft="10dp"
            android:paddingStart="10dp"
            android:paddingRight="10dp"
            android:layout_marginTop="15dp"
            android:layout_marginBottom="12dp"
            android:paddingEnd="10dp"
            android:gravity="center_vertical"
            android:weightSum="1">

            <TextView
                android:id="@+id/tv_heading"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="0.8"
                android:gravity="center_vertical"
                android:text=""
                android:textColor="@color/dark_grey"
                android:textSize="@dimen/midium_text_size" />

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="0.2"
                android:id="@+id/linearLayout_viewall"
                android:visibility="gone"
                android:gravity="center_vertical|end"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/tv_more"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:drawablePadding="5dp"
                    android:gravity="center_vertical|end"
                    android:text="@string/view_all"
                    android:textSize="@dimen/small_text_size" />

                <ImageView
                    android:layout_width="15dp"
                    android:layout_height="15dp"
                    android:contentDescription="@null"
                    android:src="@drawable/next" />
            </LinearLayout>
        </LinearLayout>

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

I am putting some main adapter code with multiType: 我把一些主要的适配器代码与multiType:

@Override
public int getItemCount() {
    int size = 4;
    if (isErrorView) {
        size = 1;
    }
    return size;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = null;

    if (viewType == TYPE_NEARBY
            || viewType == TYPE_PEOPLE || viewType == TYPE_DEFAULT || viewType == TYPE_SERVICES) {

        view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_discover_adapter, parent, false);
        RecyclerView.ViewHolder timelineViewHolder = new vHolderEverything(view);
        return timelineViewHolder;

    } else if (viewType == TYPE_ERROR) {
        view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.inflator_error_listview, parent, false);
        vHolderError timelineViewHolder = new vHolderError(view);
        return timelineViewHolder;
    }
    return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    String headingText = "";
    boolean isMainBlockInvisible = false;
    vHolderEverything mVHolder;
    switch (getItemViewType(position)) {
        case TYPE_ERROR:
            break;
        case 1:
            mVHolder = (vHolderEverything) holder;
            try {
                GridLayoutManager lLayout = new GridLayoutManager(curr_activity, 2);
                mVHolder.rv_category_outlet.setNestedScrollingEnabled(false);
                mVHolder.rv_category_outlet.setHasFixedSize(true);

                int spanCount = 4; // 3 columns
                int spacing = 4; // 50px
                boolean includeEdge = false;

                mVHolder.rv_category_outlet.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing, includeEdge));
                mVHolder.rv_category_outlet.setLayoutManager(lLayout);

                if (dataForDiscovery != null) {
                    try {

                        if (position == TYPE_SERVICES) {
                            headingText = curr_activity.getResources().getString(R.string.popular_Service);

                            mVHolder.adapterObject_services.clear();
                            mVHolder.adapterObject_services.addAll(dataForDiscovery.getData().getPopularServices());
                            if (mVHolder.adapterObject_services != null && mVHolder.adapterObject_services.size() > 0) {
                               mVHolder.rv_category_outlet.setAdapter(mVHolder.discoveryPopularListAdapter);
                            } else {
                                isMainBlockInvisible = true;
                            }
                        } else {
                            isMainBlockInvisible = true;

                        }

                    } catch (Exception e) {
                        isMainBlockInvisible = true;
                    }
                } else {
                    isMainBlockInvisible = true;
                }

            } catch (Exception e) {
                isMainBlockInvisible = true;
            }

            if (isMainBlockInvisible) {
                mVHolder.ll_main_block.setVisibility(View.GONE);
            } else {
                ((vHolderEverything) holder).linearLayout_viewall.setVisibility(View.GONE);
                mVHolder.tv_heading.setText(headingText);
                mVHolder.tv_more.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Activity_Search.search_initiate_view_pager.setCurrentItem(position);
                    }
                });
            }
            break;
        case 2:

            mVHolder = (vHolderEverything) holder;
            try {
                LinearLayoutManager layoutManager = new org.solovyev.android.views.llm.LinearLayoutManager(curr_activity, LinearLayoutManager.VERTICAL, false);
                mVHolder.rv_category_outlet.setLayoutManager(layoutManager);
                mVHolder.rv_category_outlet.setHasFixedSize(true);

                if (dataForDiscovery != null) {
                    try {
                        if (position == TYPE_PEOPLE) {

                            mVHolder.adapterObject.clear();
                            mVHolder.adapterObject.addAll(dataForDiscovery.getData().getPeople());
                            headingText = curr_activity.getResources().getString(R.string.follow_people_discover);
                            if (mVHolder.adapterObject != null && mVHolder.adapterObject.size() > 0) {
                                mVHolder.rv_category_outlet.setAdapter(mVHolder.adapter);
                            } else {
                                isMainBlockInvisible = true;
                            }
                        } else {
                            isMainBlockInvisible = true;

                        }

                    } catch (Exception e) {
                        isMainBlockInvisible = true;
                    }
                } else {
                    isMainBlockInvisible = true;
                }

            } catch (Exception e) {
                isMainBlockInvisible = true;
            }

            if (isMainBlockInvisible) {
                mVHolder.ll_main_block.setVisibility(View.GONE);
            } else {
                // if (headingText.equalsIgnoreCase("Services")) {
                ((vHolderEverything) holder).linearLayout_viewall.setVisibility(View.GONE);
                // } else {
                //   ((vHolderEverything) holder).linearLayout_viewall.setVisibility(View.VISIBLE);
                //}
                mVHolder.tv_heading.setText(headingText);
                mVHolder.tv_more.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Activity_Search.search_initiate_view_pager.setCurrentItem(position);
                    }
                });
            }
            break;
        case TYPE_DEFAULT:
            mVHolder = (vHolderEverything) holder;
            mVHolder.ll_main_block.setVisibility(View.GONE);
            break;
        default:
            mVHolder = (vHolderEverything) holder;
            mVHolder.ll_main_block.setVisibility(View.GONE);

            break;
    }

}

public static class vHolderEverything extends RecyclerView.ViewHolder {
    TextView tv_heading;
    TextView tv_more;
    RecyclerView rv_category_outlet;
    LinearLayout ll_main_block, linearLayout_viewall;
    ArrayList<ReusableServices> adapterObject_services= new ArrayList<ReusableServices>();
    DiscoveryPopularListAdapter discoveryPopularListAdapter = null;
    RecyclerView.Adapter adapter = null;
    ArrayList<FollowPeopleSuggestionData> adapterObject= new ArrayList<FollowPeopleSuggestionData>();

    public vHolderEverything(View itemView) {
        super(itemView);

        this.tv_heading = (TextView) itemView.findViewById(R.id.tv_heading);
        this.tv_more = (TextView) itemView.findViewById(R.id.tv_more);
        this.rv_category_outlet = (RecyclerView) itemView.findViewById(R.id.rv_category_outlet);
        this.ll_main_block = (LinearLayout) itemView.findViewById(R.id.ll_main_block);
        this.linearLayout_viewall = (LinearLayout) itemView.findViewById(R.id.linearLayout_viewall);
        MazkaraApp.getInstance().applyTypefaceItalic(tv_more);
        MazkaraApp.getInstance().applyTypefaceBlack(tv_heading);


        try {
            if (adapterObject_services != null)
                discoveryPopularListAdapter = new DiscoveryPopularListAdapter(curr_activity, adapterObject_services);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if (adapterObject != null)
                adapter = new AdapterRecycler_Search_Users(curr_activity, curr_activity, adapterObject);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

It happens only if it is first time. 仅在第一次时才发生。 second time it works as normally it should. 第二次正常工作。

While setting your respective childview adapters to their associated recyclerViews, set it's nested scrolling to false. 在将各自的子视图适配器设置为关联的recyclerViews时,将其嵌套滚动设置为false。 Here's an excerpt: 摘录如下:

childRecyclerView1.setAdapter(childAdapter1);
childRecyclerView1.setNestedScrollingEnabled(false);

This should smoothen the scrolls. 这应该使滚动平滑。

@Anant i had the same requirement and the below trick worked. @Anant我有相同的要求,以下技巧也有效。 Put the parent recyclerview inside NestedScrollView and in your onCreate method, set. 将父recyclerview放在NestedScrollView内,并在onCreate方法中进行设置。

mRecyclerView.setHasFixedSize(true);
mRecyclerView.setNestedScrollingEnabled(false);

This prevents scroll of parent recyclerview and scroll becomes absolutely smooth. 这样可以防止父级recyclerview滚动,并且滚动变得绝对平滑。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM