0

我有一個使用ViewPager的三個選項卡界面設置。在第三個標籤中,我有一個CardView,它可以展開/收回onclick以顯示更多信息。 CardView內部是一個RecyclerView,充滿了大量的數據。Android Preload Recycleview Contents

第一次打開應用程序並擴展卡片視圖時,擴展動畫非常滯後,但之後可以順利擴展/縮回。 RecyclerView數據也可以在沒有問題的情況下更新。

有沒有辦法在打開應用程序時以某種方式加載/緩存數據,因此lagg不會發生。

對不起,如果問題不好,剛開始android開發。 由於

佈局第三選項卡:

<android.support.v7.widget.CardView 
    android:id="@+id/SF_frame" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="4dp"> 

    <LinearLayout 
     android:id="@+id/SF_wrapper" 
     android:layout_width="fill_parent" 
     android:layout_height="80dp" 
     android:orientation="vertical"> 

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

     </android.support.v7.widget.RecyclerView> 
    </LinearLayout> 
</android.support.v7.widget.CardView> 

其用於膨脹recyclerView的數據是用2個浮動變量每個對象的列表。粗略長度〜50。

用於膨脹各個項目的XML:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="4sp" 
    android:orientation="horizontal"> 

    <RelativeLayout 
     android:layout_width="0dp" 
     android:layout_height="36sp" 
     android:layout_weight="1"> 

     <TextView 
      android:id="@+id/value_1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="lorem" 
      android:textSize="8sp" /> 

    </RelativeLayout> 

    <RelativeLayout 
     android:layout_width="0dp" 
     android:layout_height="36sp" 
     android:layout_weight="1"> 

     <TextView 
      android:id="@+id/value_2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="ipsom" 
      android:textSize="8sp" /> 

    </RelativeLayout> 
</LinearLayout> 

展開代碼/縮回cardView簡單動畫改變SF_frame的高度以顯示RecyclerView的多個元件,它是該第一揭示其爲laggy 。

+0

什麼樣的數據以及他們如何被retreived?如果有圖像(我認爲它們可能需要大量處理器時間給初學者)嘗試使用一些帶有異步加載的庫(首先嚐試http://square.github。io/picasso /) – VizGhar

+0

嗨,感謝您的回覆,信息只是一堆數字,這是在另一個功能計算。我認爲lagg並沒有提取數據,只是第一次顯示一堆隱藏的視圖 –

+0

您可以先添加Cardview xml嗎?那麼我們應該知道問題出在哪裏......我不認爲預加載數據是聰明的做法。只有有真正巨大的數據。 – VizGhar

回答

1

解決您的布點爲第一: 使用sp只有文字和dp其他尺寸(寬,高,利潤率,填充等)。對於文本,建議至少使用android:textsize="12sp"。查看android:gravity屬性而不是android:layout_gravity,因此您不必使用父級佈局來居中。

<android.support.v7.widget.CardView 
    android:id="@+id/SF_frame" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="4dp"> 

    <!-- No need to use LinearLayout since only one child is used --> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/SF_list" 
     android:layout_width="match_parent" 
     android:layout_height="80dp"> 

    </android.support.v7.widget.RecyclerView> 
</android.support.v7.widget.CardView> 

在此佈局中,如果你正在擴大RecyclerView,有可能是新的觀點正在被實例化(RecyclerView.Adapter.onCreateViewHolderRecyclerView.Adapter.onBindViewHolder)被稱爲多張倍。 事實上,切換到該選項卡也有點延遲,但它在動畫上清晰可見。 (你是從大約3項expandig到像20左右,我不知道你的佈局的其餘部分的外觀)

和第二:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="4dp" 
    android:orientation="horizontal"> 
    <TextView 
     android:id="@+id/value_1" 
     android:layout_width="0dp" 
     android:layout_height="36dp" 
     android:layout_weight="1" 
     android:layout_gravity="center" 
     android:text="lorem" 
     android:textSize="8sp" /> 

    <TextView 
     android:id="@+id/value_2" 
     android:layout_width="0dp" 
     android:layout_height="36dp" 
     android:layout_weight="1" 
     android:layout_gravity="center" 
     android:text="ipsom" 
     android:textSize="8sp" /> 
</LinearLayout> 

如果填補這些2 TextViews是這麼可怕的慢,你正在經歷hickups。然後你可能做非常複雜的數學運算(儘可能簡化它們),或者你以某種方式同步下載數據並等待結果。

AsyncTask看看,並使用它,而綁定數據......你可以使用它是這樣的(自行修改):

private class MyAsyncTask extends AsyncTask<Void, Void, String> { 

    private TextView view; 

    MyAsyncTask(TextView view) { 
     this.view = view; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // display progressbar or something 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     // do heavyweight operation here 
     String result = heavyWeightOperation(params); 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     // hide progressbar or something 
     if (view != null) { 
      view.setText(s); 
     } 
     super.onPostExecute(s); 
    } 
} 
+0

有人贊成這個:)現在你可以忘記'AsyncTask'並使用'AsyncTaskLoader','Rx'構造或者更相關的東西 – VizGhar