Question Question - 2 months ago 23
Android Question

Crash with Glide on android app

My application closes every time I try to see the images. Can you explain why?

I think maybe the problem is the string

Glide.with(getApplicationContext())
, maybe it isn't correct. But for Android Studio I don't have errors:

All other elements are ok, the problem is only glide.

public class MainActivity extends AppCompatActivity {

private final String url= "MY ARRAY";
...

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
new gson().execute(url);
}

public class gson extends AsyncTask<String,String, List<MovieModel> >{

....
public class Adapter extends ArrayAdapter{
private List<MovieModel> movieModelList;
private int resource;
private LayoutInflater inflater;
public Adapter(Context context, int resource, List<MovieModel> objects) {
super(context, resource, objects);
movieModelList = objects;
this.resource = resource;
inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
holder = new ViewHolder();
convertView = inflater.inflate(resource, null);
holder.fruitsfoto = (ImageView)convertView.findViewById(R.id.fruits);
holder.fruitsname = (TextView)convertView.findViewById(R.id.name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ImageView imageView = (ImageView) findViewById(R.id.pics);
final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar);
try {
Glide.with(MainActivity.this)//getApplicationContext()
.load(ModelList.get(position).getImage())
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
progressBar.setVisibility(View.GONE);
return false;
}
})
.into(imageView);
} catch (Exception e) {
e.printStackTrace();
}
holder.fruitsname.setText(ModelList.get(position).getName());
return convertView;
}
}
}


Update: The show images don't follow the list of array. Need a solution.

public Adapter(Context context, int resource, List<MovieModel> objects) {
super(context, resource, objects);
ModelList = objects;
this.resource = resource;
inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
}
.....
try {
Glide.with(MainActivity.this)//getApplicationContext()
.load(ModelList.get(position).getFruits())
.into(imageView);
} catch (Exception e) {
e.printStackTrace();
}


Edit:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
holder = new ViewHolder();
convertView = inflater.inflate(resource, null);
holder.fruitsfoto = (ImageView)convertView.findViewById(R.id.fruits);
holder.fruitsname = (TextView)convertView.findViewById(R.id.name);
ImageView imageView = (ImageView)convertView.findViewById(R.id.pics);
convertView.setTag(holder);
//this return "Variable 'imageView is never used'"

Answer

Please check if you have added the INTERNET permission in your application manifest?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="viewpager.nested.example.com.testapplicationforso">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        ...
    </application>

</manifest>

And yes, it always good to have your glide image loading code segment inside a try/catch statement.

try {
    Glide.with(getApplicationContext()).load(yourUrl).into(img);
} catch (Exception e) {
    e.printStackTrace();
}

Update:

About the images wrongly placed - I could see that in your getView function, you did not find the ImageView properly. You need to find the ImageView inside convertView like the other items in the list like this.

ImageView imageView = (ImageView) convertView.findViewById(R.id.pics);
Comments