I have data from a WS that need to be shown on an Android ListView. Data can be of different types, so i need to dynamically create a layout for ListView items, how can i do it? I think i have to use LayoutInflater but have always used it with existing layouts and never created a layout from scratch. How can i do it?
2 Answers
you need to create adapter for that
just check this link it elaborate all about using adapters.
http://www.vogella.de/articles/AndroidListView/article.html
// edited
in the given url just check this code
import android.content.Context;
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 MySimpleArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final String[] values;
public MySimpleArrayAdapter(Context context, String[] values) {
super(context, R.layout.rowlayout, values);
this.context = context;
this.values = values;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.rowlayout, parent, false);
TextView textView = (TextView) rowView.findViewById(R.id.label);
ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
textView.setText(values[position]);
// Change the icon for Windows and iPhone
String s = values[position];
if (s.startsWith("iPhone")) {
imageView.setImageResource(R.drawable.no);
} else {
imageView.setImageResource(R.drawable.ok);
}
return rowView;
}
}
where R.layout.rowlayout is the layout for your each row in which you can define your imageviews,textviews
3 Comments
As you mention you're using different datatypes, I assume you want to show different layouts per datatype. It's not necessary to dynamically create your listview-items; if you want, you can just inflate them from XML.
Create a custom listadapter (see the link to vogella provided by vipin) and override the getView(), getItemViewType() and getViewTypeCount() methods.
In getView() you build your views either programmatically or inflate them from XML. To determine which layout to inflate (or build), call getItemViewType(position), check the value it returns and then choose which layout to inflate for that value. For more info on how to build XML-layouts, see this page in the dev guide on XML layouts.
Next, take a look at this answer and implement this into your adapter. Be sure to also read the comments. For example, override getItemViewType() with something like:
public int getItemViewType(int position) {
if(getItem(position) instanceOf ItemA) {
return 0;
} else {
return 1;
}
}
This approach allows your listview to recycle views and use the ViewHolder-pattern (for more info, again see the link vipin provided).