2015-10-26 119 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