Igor
Igor

Reputation: 205

ArrayList in Fragment

I am novice with fragments and Im trying to do a custom list from xml file in a fragment and I have an issue with

final ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

my code is below, somebody can help me? Thank you

public class InformesFragment extends Fragment {

static final String URL = "http://www.myurl.com";
// XML node keys
static final String KEY_SONG = "songs"; // parent node
static final String KEY_ID = "id_song";
static final String KEY_TITLE = "name";
static final String KEY_THUMB_URL = "picture";
static final String KEY_ARTIST = "duration";



ListView list;
LazyAdapter adapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    return inflater.inflate(R.layout.songs, container, false);

    final ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(URL); // getting XML from URL
    Document doc = parser.getDomElement(xml); // getting DOM element

    NodeList nl = doc.getElementsByTagName(KEY_SONG);
    // looping through all song nodes <song>
    for (int i = 0; i < nl.getLength(); i++) {
        // creating new HashMap
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        // adding each child node to HashMap key => value
        map.put(KEY_ID, parser.getValue(e, KEY_ID));
        map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
        map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
        map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));


        // adding HashList to ArrayList
        songsList.add(map);
    }

    list=(ListView) getView().findViewById(R.id.list);

    // Getting adapter by passing xml data ArrayList
    adapter=new LazyAdapter(this, songsList);        
    list.setAdapter(adapter);


    // Click event for single list row
    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {



              String id =songsList.get(+position).get("id_song");
              String nombre =songsList.get(+position).get("name");
              String caratula =songsList.get(+position).get("picture");
              String duracion =songsList.get(+position).get("duration");


              Intent intent = new Intent(getActivity(), Myclass.class);
              intent.putExtra("id", id);
              intent.putExtra("izena", nombre);
              intent.putExtra("karatula", caratula);
              intent.putExtra("gureop", duración);

              startActivity(intent);
        }
    });     

} }

My LazyAdapter is:

public class LazyAdapter extends BaseAdapter {

private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader; 

public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new ImageLoader(activity.getApplicationContext());
}

public LazyAdapter(InformesFragment informesFragment,
        ArrayList<HashMap<String, String>> songsList) {
    // TODO Auto-generated constructor stub
}

public int getCount() {
    return data.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.list_row, null);

    TextView title = (TextView)vi.findViewById(R.id.title); // title
    ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image

    HashMap<String, String> song = new HashMap<String, String>();
    song = data.get(position);

    // Setting all values in listview
    title.setText(song.get(InformesFragment.KEY_TITLE));


    imageLoader.DisplayImage(song.get(InformesFragment.KEY_THUMB_URL), thumb_image);
    return vi;
}

Upvotes: 0

Views: 6418

Answers (3)

Amarjit
Amarjit

Reputation: 4357

Please write your code as :

public class InformesFragment extends Fragment {

static final String URL = "http://www.myurl.com";
// XML node keys
static final String KEY_SONG = "songs"; // parent node
static final String KEY_ID = "id_song";
static final String KEY_TITLE = "name";
static final String KEY_THUMB_URL = "picture";
static final String KEY_ARTIST = "duration";



ListView list;
LazyAdapter adapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.songs, container, false);

    final ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(URL); // getting XML from URL
    Document doc = parser.getDomElement(xml); // getting DOM element

    NodeList nl = doc.getElementsByTagName(KEY_SONG);
    // looping through all song nodes <song>
    for (int i = 0; i < nl.getLength(); i++) {
        // creating new HashMap
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        // adding each child node to HashMap key => value
        map.put(KEY_ID, parser.getValue(e, KEY_ID));
        map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
        map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
        map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));


        // adding HashList to ArrayList
        songsList.add(map);
    }

    list=(ListView) getView().findViewById(R.id.list);

    // Getting adapter by passing xml data ArrayList
    adapter=new LazyAdapter(this, songsList);        
    list.setAdapter(adapter);


    // Click event for single list row
    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {



              String id =songsList.get(+position).get("id_song");
              String nombre =songsList.get(+position).get("name");
              String caratula =songsList.get(+position).get("picture");
              String duracion =songsList.get(+position).get("duration");


              Intent intent = new Intent(getActivity(), Myclass.class);
              intent.putExtra("id", id);
              intent.putExtra("izena", nombre);
              intent.putExtra("karatula", caratula);
              intent.putExtra("gureop", duración);

              startActivity(intent);
        }
    });     

}
 return  v;
 }

Upvotes: 0

Raghunandan
Raghunandan

Reputation: 133560

You have

return inflater.inflate(R.layout.songs, container, false);

that is the problem

Should be

View view = inflater.inflate(R.layout.songs, container, false);
 final ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element

NodeList nl = doc.getElementsByTagName(KEY_SONG);
// looping through all song nodes <song>
for (int i = 0; i < nl.getLength(); i++) {
    // creating new HashMap
    HashMap<String, String> map = new HashMap<String, String>();
    Element e = (Element) nl.item(i);
    // adding each child node to HashMap key => value
    map.put(KEY_ID, parser.getValue(e, KEY_ID));
    map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
    map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
    map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));


    // adding HashList to ArrayList
    songsList.add(map);
}

list=(ListView) view.findViewById(R.id.list);

// Getting adapter by passing xml data ArrayList
adapter=new LazyAdapter(this, songsList);        
list.setAdapter(adapter);


// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {



          String id =songsList.get(+position).get("id_song");
          String nombre =songsList.get(+position).get("name");
          String caratula =songsList.get(+position).get("picture");
          String duracion =songsList.get(+position).get("duration");


          Intent intent = new Intent(getActivity(), Myclass.class);
          intent.putExtra("id", id);
          intent.putExtra("izena", nombre);
          intent.putExtra("karatula", caratula);
          intent.putExtra("gureop", duración);

          startActivity(intent);
    }
    }); 
    return view;

Also you have

String xml = parser.getXmlFromUrl(URL); // geting xml from url should be from a thread.

Also need to change

list=(ListView) getView().findViewById(R.id.list);

to

list=(ListView) view.findViewById(R.id.list);

Upvotes: 2

ejohansson
ejohansson

Reputation: 2882

I also suggest parsing the data in onCreate() or onResume() rather than onCreateView().

Ex.

Parse in onCreate() attach/setAdapter in onCreateView()

Parse in onResume() attach/setAdapter in onResume()

Even better use an AsyncTask and parse the data in the background then update your list.

Upvotes: 0

Related Questions