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;
}
}
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.
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);
}
});
}