Search code examples
androidandroid-recyclerviewandroid-imageviewandroid-cardviewandroid-studio-3.0

android studio failed to load bitmap


Hello guys I'm having trouble with my app it always shows error out of memory or bitmap allocation failed. I think because of the large images I have a recyclerview, cardview and a gridview I think the answer to my question is using an image loader like glide or picasso but I don't know how to input it into my codes there's no get.(position) in my onbindViewholder to input my glide and all my images are in drawable not in URL please help me guys . I got this on Youtube it's for a thesis project this is my code:

TraceMyAdapter

public class TraceMyAdapter extends RecyclerView.Adapter<TraceMyHolder> {
    Context c;
    String[] alphabet;
    int[] images;

    public TraceMyAdapter(Context ctx, String[] alphabet, int[] images){
        this.c = ctx;
        this.alphabet = alphabet;
        this.images = images;
    }

    @Override
    public TraceMyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.trace_cardview, null);
        TraceMyHolder holder = new TraceMyHolder(v);
        return holder;
    }

    @Override
    public void onBindViewHolder(TraceMyHolder holder, final int position) {
        int s = holder.getAdapterPosition();

        holder.img.setImageResource(images[position]);

        holder.alphabetTxt.setText(alphabet[position]);

        holder.setItemClickListener(new TraceItemClickListener() {
            @Override
            public void onItemClick(View v, int pos) {
                Intent i=new Intent(c,Trace_view.class);

                i.putExtra("Letters",alphabet[position]);
                i.putExtra("Images",images[position]);
                c.startActivity(i);
            }
        });
    }

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

Tracingmenu

public class Tracing_menu extends AppCompatActivity {
    String[] names = {
            "Letter A",
            "Letter B",
            "Letter C",
            "Letter D",
            "Letter E",
            "Letter F",
            "Letter G"};

    int[] images = {
            R.drawable.bga,
            R.drawable.bgb,
            R.drawable.bgc,
            R.drawable.bgd,
            R.drawable.bge,
            R.drawable.bgf,
            R.drawable.bgg
    };

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

        RecyclerView rv = findViewById(R.id.myRecycler);

        rv.setLayoutManager(new GridLayoutManager(this, 3));
        rv.setItemAnimator(new DefaultItemAnimator());

        TraceMyAdapter adapter = new TraceMyAdapter(this, names, images);
        rv.setAdapter(adapter);
    }
}

MyHolder

public class TraceMyHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    ImageView img;
    TextView alphabetTxt;
    private TraceItemClickListener TraceitemClickListener;

    public TraceMyHolder(View itemView) {
        super(itemView);

        img = (ImageView) itemView.findViewById(R.id.img_alphabet);
        alphabetTxt = (TextView) itemView.findViewById(R.id.txt_alphabet);

        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        this.TraceitemClickListener.onItemClick(view, getLayoutPosition());
    }

    public void setItemClickListener(TraceItemClickListener ic){
        this.TraceitemClickListener = ic;
    }
}

Solution

  • I would suggest you take a look at the image sizes of those drawables. They are probably bigger than they need to be. Glide will help but the best thing to do is have the correct size images for different drawable buckets. Make sure to review the Supporting different screen sizes android docs. Pay attention to the density buckets and image size multipliers.

    screen density multipliers

    From glide docs put this in gradle.

    repositories {
      mavenCentral()
      google()
    }
    
    dependencies {
      implementation 'com.github.bumptech.glide:glide:4.6.1'
      annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'
    }
    

    in your onBindViewHolder

    @Override
    public void onBindViewHolder(TraceMyHolder holder, final int position) 
    {
    int s = holder.getAdapterPosition();
    
    
    
    Glide.with(ctx).load(images[position]).into(holder.img);
    
    
    holder.alphabetTxt.setText(alphabet[position]);
    
    holder.setItemClickListener(new TraceItemClickListener() {
        @Override
        public void onItemClick(View v, int pos) {
            Intent i=new Intent(c,Trace_view.class);
    
            i.putExtra("Letters",alphabet[position]);
            i.putExtra("Images",images[position]);
    
    
            c.startActivity(i);
        }
    });
    }