【问题标题】:RecyclerView scroll lags with simple itemsRecyclerView 滚动滞后于简单项目
【发布时间】:2017-05-20 11:49:47
【问题描述】:

我有一个简单的回收器视图,其中包含只有 1 个 imageView 的卡片视图,它是从资源加载的,但是无论如何滚动时我都有很强的滞后性,我尝试了 recycler.setHasFixedSize(true) 但它没有帮助。

活动代码

public class MainActivity extends AppCompatActivity {

    private final int[] drawables = {
            R.drawable.nxt_bluetooth_dongle,
            R.drawable.color_sensor,
            R.drawable.connector_cabels,
            R.drawable.e_motor,
            R.drawable.energy_storage,
            R.drawable.energy_display,
            R.drawable.gyroscopic_sensor,
            R.drawable.intelligent_nxt_brick,
            R.drawable.keyfob_transponder,
            R.drawable.light_sensor,
            R.drawable.motion_sensor,
            R.drawable.nxt_ir_receiver,
            R.drawable.nxt_light_sensor,
            R.drawable.nxt_servo_motor,
            R.drawable.nxt_sound_sensor,
            R.drawable.nxt_touch_sensor,
            R.drawable.nxt_ultrasonic_sensor,
            R.drawable.rf_id_sensor,
            R.drawable.solar_panel,
            R.drawable.tilt_sensor,
            R.drawable.temperature_sensor,
            R.drawable.usb_hub
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler);
        MyAdapter adapter = new MyAdapter(drawables);
        recycler.setAdapter(adapter);
        recycler.setLayoutManager(new GridLayoutManager(this, 3));
    }

    private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {

        private int[] drawables;

        private MyAdapter(int[] drawables) {
            this.drawables = drawables;
        }

        @Override
        public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.lego_recycler_item, null, false);
            return new MyHolder(view);
        }

        @Override
        public void onBindViewHolder(MyHolder holder, int position) {
            holder.legoImage.setImageResource(drawables[position]);
        }

        @Override
        public int getItemCount() {
            return drawables.length;
        }

        class MyHolder extends RecyclerView.ViewHolder {

            ImageView legoImage;

            MyHolder(View itemView) {
                super(itemView);
                legoImage = (ImageView) itemView.findViewById(R.id.legoImage);
                legoImage.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent intent = new Intent(MainActivity.this, LegoDetailActivity.class);
                        intent.putExtra(LegoDetailActivity.EXTRA_DRAWABLE_ID, drawables[getAdapterPosition()]);
                        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                                MainActivity.this, legoImage, "legoDetail"
                        );
                        startActivity(intent, options.toBundle());
                    }
                });
            }
        }
    }
}

活动 xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/recycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#e0e0e0"
    tools:context="com.lol.legomindstorms.MainActivity">

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

回收站项目 xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardUseCompatPadding="true"
    app:cardCornerRadius="0dp">

    <ImageView
        android:id="@+id/legoImage"
        android:layout_width="115dp"
        android:layout_height="115dp"
        android:transitionName="legoDetail" />

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

【问题讨论】:

  • 尝试 Picasso 或 Glide 设置项目中的图像。
  • 正如@DivyeshPatel 提到的,这可能是图像的加载。提到的两个库从 UI 线程中完成了一些工作,从而获得更流畅的体验。一个副作用是图像看起来进入视野。我建议您也检查这些图像的大小/分辨率。它在磁盘上可能是 4kb,但实际上是 LxWx4 或 LxW*(AARRGGBB)。
  • 查看我的回答here。它可能对您的问题有所帮助。

标签: android


【解决方案1】:

根据我的经验,我认为问题在于加载多个图像
由于 android 在内存中加载大量图像时确实存在问题, 因为android默认不允许很多gc memeory size, 查看您的日志,您是否收到 gc 内存过载错误 或类似的东西

1.你也可以尝试改变堆大小

2.尝试使用外部库,总有人说永远不要重新发明轮子 试试滑翔或毕加索

3.尝试自己清除位图内存

PS:我不是那么写,所以请不要介意我的措辞是否不好,但我已经处理了很多这些问题,所以我非常熟悉这个问题

【讨论】:

  • 更改堆大小只是解决更深层次问题的临时解决方案,那就是您的内存管理。如果您想自己清除位图,那么您希望覆盖onViewRecycled(View view)。我建议将 Glide 或 Picasso 与 onViewRecycled(View view) 结合使用
  • 是的,我同意如果涉及大量图像,使用 Picasso 和 glide 或任何其他类似的库总是很棒
猜你喜欢
  • 2023-04-06
  • 2018-01-30
  • 1970-01-01
  • 2014-10-08
  • 2017-06-14
  • 1970-01-01
  • 2021-05-11
  • 2021-08-14
相关资源
最近更新 更多