RecyclerView - 嵌套的RecyclerView StackOverflowError

时间:2015-12-22 06:54:46

标签: android android-recyclerview recyclerview-layout

我正在我的应用中实现嵌套RecyclerView,其中垂直Recycler将另一个Recycler作为其项目。一切都很好,我得到了理想的意见。但我还需要将Sync Scrolling添加到这些视图中。我已经这样做了。我面临的问题是当嵌套列表的数量只有5-6时,我在滚动时得到StackOverflowErrorHere是我在向我的应用添加同步滚动时所遵循的内容。

我知道当嵌套StackOverfloError太多时你得到RecyclerView,但我得不到的是甚至5-6 RecyclerView太多了。 (我可能需要多达30 RecyclerView s)但这既不在这里也不在那里。但是,在任何给定时间,在任何给定时间最多显示7个视图。

以下是我的RecyclerView布局文件item_layout.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:visibility="visible">

<android.support.v7.widget.RecyclerView
    android:id="@+id/programList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:visibility="gone"/>
<TextView
    android:id="@+id/noEpgMessage"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:textSize="20sp"
    android:textColor="#FFFFFF"
    android:text="@string/no_epg_found"
    android:gravity="left"
    android:visibility="gone"/>

在此RecyclerView中,我在item.xml中有以下项目。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingRight="1dp">

<TextView
    android:id="@+id/epgProgramItem"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:textColor="#000000"
    android:textSize="16sp"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:gravity="center_vertical|left"
    android:background="@drawable/epg_program_background"/>

以下是ViewHolder.java中的同步滚动代码。

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {

            private int mLastY;
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                Log.d(TAG, "ProgramsList: onInterceptTouchEvent()");

                if (rv.getScrollState() == RecyclerView.SCROLL_STATE_IDLE) {
                    onTouchEvent(rv, e);
                }

                return false;
            }

            @Override
            public void onTouchEvent(RecyclerView rv, MotionEvent e) {

                final int action = e.getAction();

                if (action == MotionEvent.ACTION_DOWN) {

                    mLastY = rv.getScrollY();
                    Log.d("ListenerAddRemove", "Listener for " + rv.getTag() + " added");
                    rv.addOnScrollListener(selfRemovingListener);
                }
                else if (action == MotionEvent.ACTION_UP && rv.getScrollY() == mLastY) {

                    Log.d("ListenerAddRemove", "Removed");
                    rv.removeOnScrollListener(selfRemovingListener);
                }
            }

            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

            }
        });


private final RecyclerView.OnScrollListener selfRemovingListener = new SelfRemovingOnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, 0);

            scrollAll(recyclerView, dx, 0);
        }
    };

public void scrollAll(RecyclerView rv, int dx, int dy) {

    Log.d(TAG, "Calling Recycler Tag : " + String.valueOf(rv.getTag()));

    Log.d(TAG, "ScrollAll()");
    for (int i = 0; i < ((recyclerList != null) ? recyclerList.size(): 0); i++) {

        RecyclerView current = recyclerList.get(i);

        if (current != rv) {
            Log.d(TAG, "Current RecyclerView Tag : " + String.valueOf(current.getTag()));
            current.scrollBy(dx, dy);
        }
    }
}

我的SelfRemovingOnScrollListener.java

public class SelfRemovingOnScrollListener extends RecyclerView.OnScrollListener {

@Override
public final void onScrollStateChanged(@NonNull final RecyclerView recyclerView, final int newState) {
    super.onScrollStateChanged(recyclerView, newState);
    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
        Log.d("ListenerAddRemove", "Self Removing Listener Removed");
        recyclerView.removeOnScrollListener(this);
    }
}

}

所以这是我的问题。

  • 如果有办法,我该怎么解决这个问题呢?
  • 我还能做些什么来获得相同的功能吗?
  • 我可以安全地使用多少RecyclerView让应用程序崩溃?

我已阅读以下link并且对我没什么帮助。

0 个答案:

没有答案