Reputation: 205
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
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
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
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