【问题标题】:Android Preload Recycleview ContentsAndroid Preload Recycleview 内容
【发布时间】:2017-08-01 19:31:47
【问题描述】:

我有一个使用 ViewPager 的三选项卡界面设置。在第三个选项卡中,我有一个 CardView,它可以展开/收回 onclick 以显示更多信息。 CardView 内部是一个 RecyclerView,里面充斥着一堆数据。

应用程序第一次打开并展开 CardView 时,展开动画比较滞后,但之后可以顺利展开/缩回。 RecyclerView 数据也可以毫无问题地更新。

有没有办法在打开应用程序时以某种方式加载/缓存数据,以免出现延迟。

对不起,如果问题很差,刚开始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 的更多元素,而这是第一次显示延迟。

【问题讨论】:

  • 什么样的数据以及它们是如何被检索的?如果有图片(我认为初学者可能需要大量的处理器时间)尝试使用一些异步加载的库(首先点击尝试square.github.io/picasso
  • 您好,感谢您的回复,信息只是一堆数字,在另一个函数中计算。我认为延迟与其说是获取数据,不如说是第一次显示一堆隐藏的视图
  • 您可以先添加您的 Cardview xml 吗?那么我们应该知道问题可能出在哪里......我不认为预加载数据是明智的方式。仅当有真正庞大的数据时。
  • 我已经在相关代码中添加了。再次感谢您的宝贵时间。
  • 好吧,你的布局很糟糕,稍后会给你写一个更正的答案......所以问题可能只是动画或数据本身。我认为数据更有可能,因为动画只滞后一次。您还可以通过一些关于如何填充 TextViews 的简化代码吗?您可能需要异步填充它们(AsyncTask 最适合此)

标签: android performance android-recyclerview preload android-cardview


【解决方案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)。 实际上切换到那个 Tab 也有一点延迟,但是在动画上是清晰可见的。 (您正在从大约 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 非常慢,那么您正在经历打嗝。然后你可能会做非常非常复杂的数学运算(尽可能简化它们)或者你正在以某种方式同步下载数据并等待结果。

请查看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);
    }
}

【讨论】:

  • 哇有人赞了这个:) 现在你可以忘记AsyncTask 并使用AsyncTaskLoaderRx 构造或更相关的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
相关资源
最近更新 更多