RecyclerView滚动滞后与简单的项目

时间:2017-05-20 11:49:48

标签: android

我有一个简单的回收站视图,其中包含卡片视图,里面只有1个imageView,它是从资源加载的,但是我在滚动时有很强的滞后,我尝试了recycleler.setHasFixedSize(true),但它没有帮助。 / p>

活动代码

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>

Recycler item 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>

1 个答案:

答案 0 :(得分:0)

根据我的经验,我认为问题在于加载多个图像 因为android在内存中加载大量图像时遇到问题, 因为android默认不允许很多gc记忆大小, 检查你的日志你得到一个gc内存超载错误 或类似的东西

1.您还可以尝试查看堆大小

2.尝试使用外部库,总是说从不重新发明轮子 试试滑行或者piccaso

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

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