Adding Drawables from assets into ListView

480 views Asked by At

I have added many images in the assets folder and want to get those images from there and add it into a ListView. When i am executing the app everything is perfect but the image container of the listview appears blank(transparent). Output

The Java File:

package com.basil.victor;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import java.io.IOException;
import java.io.InputStream;

public class Events extends Fragment {

private ListView listEvent;

String eventname[]={
        "Name",
        "of",
        "the",
        "events",
        "are",
        "present",
        "here"
};

String eventlogoname[]={
        "Logo",
        "name",
        "of",
        "events",
        "are",
        "present",
        "here"
};

Drawable[] arr=new Drawable[7];

String eventsubtitle []={
        "Subtitles",
        "of",
        "the",
        "events",
        "are",
        "present",
        "here"
};

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_events, null);



    for(int i=0;i<7;i++) {
        try {
            InputStream stream = getContext().getAssets().open(eventlogoname[i] + ".jpg");
            Drawable el = Drawable.createFromStream(stream, null);
            arr[i] = el;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    EventList adapter = new
            EventList(getActivity(), eventname, arr, eventsubtitle);
    //ListView lv = (ListView)rootView.
    listEvent=(ListView)view.findViewById(R.id.listEvent);
    listEvent.setAdapter(adapter);


    return view;
}
}

ListView adapter:

package com.basil.victor;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class EventList extends ArrayAdapter<String>{

private final Activity context;
private final String[] title;
private final Drawable[] banner;
private final String[] subtitle;
public EventList(Activity context,
                  String[] title, Drawable[] banner, String[] subtitle) {
    super(context, R.layout.list_single, title);
    this.context = context;
    this.title = title;
    this.banner = banner;
    this.subtitle = subtitle;

}
@Override
public View getView(int position, View view, ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();
    View rowView= inflater.inflate(R.layout.event_row, null, true);

    TextView txtTitle = (TextView) rowView.findViewById(R.id.event_title);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.event_banner);
    TextView subTitle = (TextView) rowView.findViewById(R.id.event_subtitle);


    txtTitle.setText(title[position]);
    imageView.setImageDrawable(banner[position]);
    subTitle.setText(subtitle[position]);


    return rowView;
}
}
4

There are 4 answers

2
Haran Sivaram On BEST ANSWER

If you're getting a FileNotFound Exception,

  1. Check if the image is inside a subfolder in assets and add the appropriate path

  2. Check the case of the extension (I faced this problem for a long time before I realized my image had a .JPG (Uppercase) extension)

  3. The final string that's being searched, check for random whitespaces

0
Sunil Chaudhary On

Do it like this

class MainActivity extends AppCompatActivity {
private ListView listEvent;


String arras[]={
  "Logo",
    "name",
    "of",
    "events",
    "are",
    "present",
    "here"
};
Drawable[] arr=new Drawable[5];
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
            EventList adapter = new EventList(MainActivity.this, arras);
            //ListView lv = (ListView)rootView.
            listEvent=(ListView)findViewById(R.id.listEvent);
            listEvent.setAdapter(adapter);



        }
    }

And Adapter class is like this

 public class EventList extends BaseAdapter {
LayoutInflater inflater;
private final Activity context;
String arras[];
public EventList(Activity context,String[] arras) {
    super();
    this.context = context;
    this.arras = arras;
    inflater = (LayoutInflater) this.context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

}
@Override
public int getCount() {
    return arras.length;
}

@Override
public Object getItem(int position) {
    return arras.length;
}

@Override
public long getItemId(int position) {
    return position;
}
@Override
public View getView(int position, View myView, ViewGroup parent) {
    if (myView == null) {
        myView = inflater.inflate(R.layout.event_row, null, true);

    }

    ImageView imageView = (ImageView) myView.findViewById(R.id.event_banner);
    try {
        InputStream stream = context.getAssets().open(arras[position] + ".jpg");
        Drawable el = Drawable.createFromStream(stream, null);
        imageView.setImageDrawable(el);
    } catch (IOException e) {
        e.printStackTrace();
    }


    return myView;
}

}

0
Rissmon Suresh On

Use a ViewHolder

ViewHolder makes the list view to load faster by caching the views. If it look up the view every time by calling the findViewById(), it will be very slow.

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        ViewHolder holder; // to reference the child views for later actions

        if (v == null) {
            LayoutInflater vi =
                    (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.mainrow, null);
            // cache view fields into the holder
            holder = new ViewHolder();
            holder.ImageView = (ImageView) v.findViewById(R.id.event_banner);
            // associate the holder with the view for later lookup
            v.setTag(holder);
        } else {
            // view already exists, get the holder instance from the view
            holder = (ViewHolder) v.getTag();
        }
        // no local variables with findViewById here

        // use holder.ImageView where you were
        // using the local variable nameText before
        try {
            InputStream stream = context.getAssets().open(arras[position] + ".jpg");
            Drawable el = Drawable.createFromStream(stream, null);
            holder.ImageView.setImageDrawable(el);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return v;
    }

// somewhere else in your class definition
static class ViewHolder {
    ImageView imageView;
}
1
faiyaz meghreji On

Why are using asset folder for images? if it is not necessary then you can use drawable for same put all images in drawable folder and

package com.basil.victor;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import java.io.IOException;
import java.io.InputStream;

public class Events extends Fragment {

private ListView listEvent;

String eventname[]={
        "Name",
        "of",
        "the",
        "events",
        "are",
        "present",
        "here"
};



int[] arr=new int[7];

String eventsubtitle []={
        "Subtitles",
        "of",
        "the",
        "events",
        "are",
        "present",
        "here"
};

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_events, null);

 arr[]={
            R.drawable.Logo,
            R.drawable.name,
            R.drawable.of,
            R.drawable.events,
            R.drawable.are,
            R.drawable.present,
            R.drawable.here
    };



    EventList adapter = new
            EventList(getActivity(), eventname, arr, eventsubtitle);
    //ListView lv = (ListView)rootView.
    listEvent=(ListView)view.findViewById(R.id.listEvent);
    listEvent.setAdapter(adapter);


    return view;
}
}

adapter:

package com.basil.victor;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class EventList extends ArrayAdapter<String>{

private final Activity context;
private final String[] title;
private final int[] banner;
private final String[] subtitle;
public EventList(Activity context,
                  String[] title, int[] banner, String[] subtitle) {
    super(context, R.layout.list_single, title);
    this.context = context;
    this.title = title;
    this.banner = banner;
    this.subtitle = subtitle;

}
@Override
public View getView(int position, View view, ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();
    View rowView= inflater.inflate(R.layout.event_row, null, true);

    TextView txtTitle = (TextView) rowView.findViewById(R.id.event_title);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.event_banner);
    TextView subTitle = (TextView) rowView.findViewById(R.id.event_subtitle);


    txtTitle.setText(title[position]);
imageView.setImageResource((banner[position]);
    subTitle.setText(subtitle[position]);


    return rowView;
}
}