2015-10-26 113 views
4

我在ViewPager里面有一个RecyclerView实现,它的性能非常糟糕。 Here's a video of the performance in question.我有两种视图类型,并使用ViewHolder模式(所以它不是通货膨胀或查找导致问题的视图)。极度延迟RecyclerView性能

Here's the adapter.

这里的cardview.xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 

android:layout_height="wrap_content" 

android:clipChildren="false" 


android:orientation="vertical" 

android:scrollbars="none"> 

<LinearLayout 
    android:id="@+id/next" 
    android:layout_width="match_parent" 
    android:layout_height="2dp" 
    android:layout_marginBottom="8dp" 
    android:elevation="8dp" 
    android:orientation="horizontal" /> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/top" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="?attr/card_background" 
    android:orientation="horizontal"> 


    <LinearLayout 
     android:id="@+id/dots" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 

     android:layout_alignParentTop="true" 

     android:background="?attr/activity_background" 
     android:orientation="horizontal"> 


    </LinearLayout> 


    <View 
     android:id="@+id/dot" 
     android:layout_width="3dp" 
     android:layout_height="match_parent" 

     android:layout_alignParentBottom="true" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@id/dots" 
     android:background="#fff" /> 


    <RelativeLayout 
     android:id="@+id/background" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/dot" 
     android:orientation="vertical" 
     android:paddingLeft="8dp" 

     android:paddingRight="8dp" 
     android:paddingTop="8dp"> 


     <include 
      android:id="@+id/children" 
      layout="@layout/commentnumber" 
      android:layout_width="wrap_content" 
      android:layout_height="16dp" 
      android:layout_alignParentRight="true" 

      android:layout_gravity="right" 
      android:layout_marginBottom="-16dp" 
      android:layout_marginLeft="10dp" 
      android:gravity="center_horizontal" 
      android:orientation="horizontal" /> 


     <com.wefika.flowlayout.FlowLayout 
      android:id="@+id/flow" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:gravity="center_vertical" 
      android:orientation="horizontal" 
      android:paddingRight="10dp"> 

      <TextView 
       android:id="@+id/author" 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent" 
       android:gravity="center_vertical" 
       android:layout_gravity="center_vertical" 

       android:paddingRight="5dp" 
       android:text="ccrama" 

       android:textColor="?attr/font" 
       android:textSize="?attr/font_commenttitle" 
       android:textStyle="bold" 

       /> 

      <TextView 
       android:id="@+id/score" 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent" 
       android:gravity="center_vertical" 
       android:layout_gravity="center_vertical" 
       android:paddingLeft="5dp" 
       android:paddingRight="5dp" 
       android:text="+49" 
       android:textColor="?attr/font" 
       android:textSize="?attr/font_commentinfo" 

       android:textStyle="bold" /> 

      <TextView 
       android:id="@+id/time" 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent" 
       android:gravity="center_vertical" 
       android:layout_alignParentRight="true" 
       android:layout_gravity="center_vertical" 
       android:paddingLeft="5dp" 
       android:paddingRight="5dp" 
       android:text="4 hours ago" 

       android:textColor="?attr/font" 

       android:textSize="?attr/font_commentinfo" /> 

      <include 
       android:id="@+id/gild" 
       layout="@layout/gilded" 
       android:layout_width="wrap_content" 
       android:layout_height="16dp" 

       android:layout_gravity="center_vertical" 
       android:gravity="center_horizontal" 
       android:orientation="horizontal" 
       android:paddingLeft="5dp" 
       android:paddingRight="5dp" /> 

      <include 
       android:id="@+id/flairbubble" 
       layout="@layout/flair" 
       android:layout_width="wrap_content" 
       android:layout_height="16dp" 

       android:layout_gravity="center_vertical" 
       android:layout_margin="5dp" 

       android:layout_toRightOf="@+id/pinned" 
       android:paddingLeft="5dp" 
       android:paddingRight="5dp" 
       android:src="@drawable/pinned" /> 

      <include 
       android:id="@+id/you" 
       layout="@layout/you" 
       android:layout_width="wrap_content" 
       android:layout_height="16dp" 

       android:layout_centerVertical="true" 
       android:layout_gravity="center_vertical" 

       android:layout_toRightOf="@+id/pinned" 
       android:paddingLeft="5dp" 
       android:paddingRight="5dp" 
       android:src="@drawable/pinned" /> 

      <include 
       android:id="@+id/op" 
       layout="@layout/op" 
       android:layout_width="wrap_content" 
       android:layout_height="16dp" 

       android:layout_marginLeft="4dp" 
       android:layout_centerVertical="true" 
       android:layout_gravity="center_vertical" 

       android:layout_toRightOf="@+id/pinned" 
       android:paddingLeft="5dp" 
       android:paddingRight="5dp" 
       android:src="@drawable/pinned" /> 
     </com.wefika.flowlayout.FlowLayout> 


     <me.ccrama.redditslide.ActiveTextView 
      android:id="@+id/content" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/flow" 
      android:paddingBottom="8dp" 

      android:textColor="?attr/font" 
      android:textSize="?attr/font_commentbody" /> 


    </RelativeLayout> 




</LinearLayout> 

<LinearLayout 
    android:id="@+id/menu" 
    android:layout_width="match_parent" 
    android:layout_height="48dp" 
    android:layout_below="@+id/background" 
    android:orientation="horizontal" 
    android:weightSum="4"> 

    <ImageView 
     android:id="@+id/more" 
     android:layout_width="0dp" 
     android:layout_height="48dp" 
     android:layout_weight="1" 

     android:background="?android:selectableItemBackground" 
     android:padding="12dp" 
     android:src="@drawable/more" 


     android:tint="?attr/tint" /> 


    <ImageView 
     android:id="@+id/downvote" 
     android:layout_width="0dp" 
     android:layout_height="48dp" 
     android:layout_weight="1" 
     android:background="?android:selectableItemBackground" 
     android:padding="12dp" 

     android:src="@drawable/downvoteicon" 
     android:tint="?attr/tint" /> 

    <ImageView 
     android:id="@+id/upvote" 
     android:layout_width="0dp" 
     android:layout_height="48dp" 
     android:layout_weight="1" 
     android:background="?android:selectableItemBackground" 
     android:padding="12dp" 
     android:src="@drawable/upvoteicon" 

     android:tint="?attr/tint" /> 

    <ImageView 
     android:id="@+id/reply" 
     android:layout_width="0dp" 
     android:layout_height="48dp" 
     android:layout_weight="1" 
     android:background="?android:selectableItemBackground" 
     android:padding="12dp" 

     android:src="@drawable/reply" 
     android:tint="?attr/tint" /> 
</LinearLayout> 

<LinearLayout 
    android:id="@+id/replyArea" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/menu" 

    android:orientation="vertical" 
    android:padding="16dp"> 

    <EditText 
     android:id="@+id/replyLine" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:backgroundTint="?attr/tint" 
     android:hint="Reply" 
     android:imeOptions="actionDone|flagNoEnterAction" 
     android:inputType="textMultiLine|textAutoCorrect|textCapSentences" 
     android:minHeight="30dp" 
     android:textColor="?attr/font" 
     android:textColorHint="?attr/font" /> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:id="@+id/discard" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="?android:selectableItemBackground" 
      android:padding="4dp" 

      android:text="DISCARD" 
      android:textColor="?attr/font" 
      android:textSize="14sp" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/send" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:background="?android:selectableItemBackground" 
      android:padding="4dp" 

      android:text="SUBMIT" 
      android:textColor="?attr/font" 

      android:textSize="14sp" 
      android:textStyle="bold" /> 
    </RelativeLayout> 

    <LinearLayout 
     android:id="@+id/innersend2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_marginLeft="-6dp" 
     android:layout_marginRight="-6dp" 
     android:alpha=".56" 

     android:gravity="center" 
     android:orientation="horizontal" 

     android:weightSum="8"> 

     <ImageButton 
      android:id="@+id/imagerep" 
      android:layout_width="0dp" 
      android:layout_height="48dp" 
      android:layout_weight="1" 
      android:height="48dp" 
      android:background="#00000000" 
      android:cropToPadding="false" 
      android:padding="8dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/image" 
      android:tint="?attr/tint" /> 


     <ImageButton 
      android:id="@+id/link" 
      android:layout_width="0dp" 
      android:layout_height="48dp" 
      android:layout_weight="1" 

      android:height="48dp" 
      android:background="#00000000" 
      android:cropToPadding="false" 
      android:padding="8dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/link" 
      android:tint="?attr/tint" /> 

     <ImageButton 
      android:id="@+id/bold" 
      android:layout_width="0dp" 
      android:layout_height="48dp" 
      android:layout_weight="1" 
      android:height="48dp" 
      android:background="#00000000" 

      android:cropToPadding="false" 
      android:padding="8dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/bold" 
      android:tint="?attr/tint" /> 

     <ImageButton 
      android:id="@+id/italics" 
      android:layout_width="0dp" 
      android:layout_height="48dp" 
      android:layout_weight="1" 

      android:height="48dp" 
      android:background="#00000000" 
      android:cropToPadding="false" 
      android:padding="8dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/italics" 
      android:tint="?attr/tint" /> 

     <ImageButton 
      android:id="@+id/bulletlist" 
      android:layout_width="0dp" 
      android:layout_height="48dp" 
      android:layout_weight="1" 
      android:height="48dp" 
      android:background="#00000000" 
      android:cropToPadding="false" 

      android:padding="8dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/bullets" 
      android:tint="?attr/tint" /> 

     <ImageButton 
      android:id="@+id/numlist" 
      android:layout_width="0dp" 
      android:layout_height="48dp" 
      android:layout_weight="1" 
      android:height="48dp" 
      android:background="#00000000" 

      android:cropToPadding="false" 
      android:padding="8dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/numbers" 
      android:tint="?attr/tint" /> 

     <ImageButton 
      android:id="@+id/quote" 
      android:layout_width="0dp" 

      android:layout_height="48dp" 
      android:layout_weight="1" 
      android:height="48dp" 
      android:background="#00000000" 
      android:cropToPadding="false" 
      android:padding="8dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/quotes" 
      android:tint="?attr/tint" /> 

     <ImageButton 
      android:id="@+id/size" 
      android:layout_width="0dp" 

      android:layout_height="48dp" 
      android:layout_weight="1" 
      android:height="48dp" 
      android:background="#00000000" 
      android:cropToPadding="false" 
      android:padding="8dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/fontsizedarker" 
      android:tint="?attr/tint" /> 
    </LinearLayout> 
</LinearLayout> 

删除除了通货膨胀仍然会导致明显的滞后的所有适配器代码。 我真的找不到这个的底部,任何帮助/提示都非常感谢。

编辑:更多信息:删除数据集“隐藏”代码(getRealPosition,hideAll,unhideAll)对RecyclerView的速度没有影响。另外,删除FlowLayout并不会让它更快。

+1

您是否在层次结构查看器工具中检出了您的视图层次结构?有一个很好的“简介”按钮,它会显示您的层次结构的度量/布局/绘制时间。您也可以将视图层次转储为图层并在图像编辑器中查看 - 也许您有很多alpha混合?你有没有检查你的“Profile GPU透支”开发者选项有多少透支? [Romain Guy关于Falcon Pro的案例研究](http://www.curious-creature.com/docs/android-performance-case-study-1.html)是开始分析你的UI性能的绝佳文章。 –

+0

非常好的建议!我一定会看看这些工具和罗曼的文章。谢谢! – ccrama

+0

我跟着文章,意识到我有非常高的(4-5)透视图并将其降低到1(好),但滚动仍然像疯了一样落后。我将努力将视图层次结构简化为1-2个视图(希望),我们将看看它是如何发展的。 – ccrama

回答

7

我与RecyclerView有同样的问题。这是滞后的。在我的情况下,RecyclerView中有一个水平的图像按钮列表。

resizing解决它通过去除从ImageButtonsImageViews和装载图像scaleType通过Picasso像:

Picasso.with(context).load(icon.get(position)).resize(270,270).centerCrop().into(holder.iconView); 

,可能会发生滞后的问题,由于大尺寸图像的运行时缩放或没有。的图像。这是不可取的。毕加索负责调整大小,并有效地加载。它也为你处理缓存。

+0

这完全是我的问题!我摆脱了水平图像,它工作得很好!我只是最终删除了图像,然后在运行时将它们放入,如果用户需要看到它们(这是长按出现的菜单)。谢谢! – ccrama

+0

@ ccrama不客气,哥们。 – TheOddAbhi

+0

使用滑翔。它快得多。 https://github.com/bumptech/glide – Eftekhari