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