简体   繁体   English

快速滚动时,如何解决recyclerview中viewpager上的意外行为?

[英]How to fix unexpected behavior on viewpager in recyclerview when fast scrolling?

My RecyclerView has viewpager on each row for several swipeable buttons. 我的RecyclerView每行都有viewpager,其中包含多个可滑动按钮。

When I scroll fast in a default state, it works fine. 当我在默认状态下快速滚动时,效果很好。

But some views (pages) are partially shown on default pages. 但是某些视图(页面)部分显示在默认页面上。 I can watch them they are swiped to default page from swiped page before (Actually not theirs. Single row which is recycled in above) 我可以看到它们从刷卡页面之前刷到默认页面(实际上不是他们的。单行在上面回收)

Sometimes really small 'partial view' is appeared corner even if they were set as default like below. 有时,即使将它们设置为如下默认值,也会出现很小的“局部视图”。

实施例] [1 Left top corner. 左上角。 I didn't even touch that row at all. 我什至根本没有碰过那排。

I suspect it's inflating speed, so I used SparseIntArray, Remove another view, Make small array for the test, Remove resources on views. 我怀疑它的速度过快,因此我使用了SparseIntArray,删除了另一个视图,为测试创建了小数组,删除了视图上的资源。 But all were worthless. 但是,一切都一文不值。

Also results in SparseIntArray are all normal as expected. SparseIntArray中的结果也一切正常。

Here are some codes below. 以下是一些代码。 Also, all xmls are 此外,所有xml都是

PageWidth 页宽

public float getPageWidth(int position)
    {
        if(position != 3 && position != 0)
        {
            return 0.15f;
        }
        else
        {
            return 1f;
        }
    }

Init and Load 初始化和加载

@Override
    public void onBindViewHolder(@NonNull mAdapter.ClipViewHolder clipViewHolder, int position)
    {
        if(stateArray.get(position) > 0 && stateArray.get(position) <= 4)
        {
            clipViewHolder.myPager.setCurrentItem(stateArray.get(position) - 1);
        }
        else
        {
            clipViewHolder.myPager.setCurrentItem(3);
            stateArray.append(position, clipViewHolder.myPager.getCurrentItem() + 1);
        }
    }

Save

@Override
    public void onViewRecycled(@NonNull ClipViewHolder holder)
    {
        stateArray.put(holder.getAdapterPosition(), holder.myPager.getCurrentItem() + 1);
        super.onViewRecycled(holder);
    }

I want to show them smoothly no matter what swipe state was, no matter how fast scroll speed. 无论滚动状态如何,无论滚动速度有多快,我都希望向他们平稳显示。 Is there any solution? 有什么解决办法吗?

//Put below code in XML file    
<android.support.v4.widget.NestedScrollView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

// put below lines in your activity as
/* catche memory */
recyclerView.setItemViewCacheSize(200);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);

RecyclerView.LayoutManager mLayoutManager = new 
   LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);

//for smooth recycler
recyclerView.setNestedScrollingEnabled(false);  // Main Line
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.smoothScrollBy(0, 10);

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

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