0

У меня есть три настройки интерфейса вкладки с помощью ViewPager. На третьей вкладке у меня есть CardView, который может расширять/убирать onclick, чтобы показать больше информации. Внутри CardView находится RecyclerView, который накачивается множеством данных.Android Preload Recycleview Содержание

В первый раз, когда приложение открывается и открывается CardView, анимация расширения довольно лаги, но впоследствии ее можно развернуть/оттянуть. Данные RecyclerView также могут быть обновлены без проблем.

Есть ли способ как-то загружать/кэшировать данные при открытии приложения, так что lagg не возникает.

Извините, если вопрос неудовлетворительный, только начинайте разработку Android. Благодаря

Layout на третьей вкладке:

<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, и именно это первое показывает что лаг ,

+0

Какие данные и как они были получены? Если есть изображения (я думаю, они могут потребовать много процессорного времени для новичков), попробуйте использовать некоторую библиотеку с асинхронной загрузкой (сначала нажмите try http: //square.github.io/picasso /) – VizGhar

+0

Привет, спасибо за ответ, информация - всего лишь куча чисел, которые вычисляются в другом funciton. Я думаю, что lagg не столько извлекает данные, сколько просто отображает кучу скрытых просмотров в первый раз –

+0

Можете ли вы добавить свой Cardview xml в первую очередь? то мы должны знать, где проблема может быть ... Я не думаю, что предварительная загрузка данных является разумным способом. Только если есть действительно огромные данные. – VizGhar

ответ

1

Устранение вашей компоновки как первая: Используйте только sp только с текстами и dp для других размеров (ширина, высота, поля, прокладки и т. Д.). Для текстов рекомендуется использовать не менее android:textsize="12sp". Посмотрите на атрибут вместо 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.onCreateViewHolder и RecyclerView.Adapter.onBindViewHolder) называются Mulitple раз. Фактически переход на эту вкладку также немного задерживается, но он хорошо заметен при анимации. (Вы expandig приблизительно от 3 пунктов, может быть, 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

Смежные вопросы