COTATION 1:
XML pour la mise en page de chaque élément de la liste -
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/
apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/listImage"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_margin="10dp"
android:background="#ffcccccc" />
<TextView
android:id="@+id/listTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/listImage"
android:layout_toRightOf="@+id/listImage"
android:text="A List item title"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/listDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/listTitle"
android:layout_marginTop="5dp"
android:maxLines="4"
android:layout_toRightOf="@+id/listImage"
android:text="The List item description"
android:textSize="14sp" />
</RelativeLayout>
Listing 2:
XML pour la mise en page contenant le Listview -
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<ListView
android:id="@android:id/list"
android:fadingEdge="vertical"
android:fadingEdgeLength="10dp"
android:longClickable="true"
android:listSelector="@drawable/list_selector_background"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
<!-- -->
<TextView
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Loading feed data..." />
<!-- -->
</LinearLayout>
#1 Listview with id of "list"
#2 TextView with id of "empty"
Listing 3:
ListActivity pour le ListView dynamique -
public class DynamicListViewActivity extends ListActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
ImageListAdapter adapter = new ImageListAdapter(this);
setListAdapter(adapter);
LoadFeedData loadFeedData = new LoadFeedData(adapter);
loadFeedData.execute();
}
}
Listing 4:
classe LoadFeedData utilisé pour le chargement des données de flux -
public class LoadFeedData extends
AsyncTask<void, void,="" arraylist<entry="">> {
private final String mUrl =
"URL_QUERING_TO_SERVER";
private final ImageListAdapter mAdapter;
public LoadFeedData(ImageListAdapter adapter) {
mAdapter = adapter;
}
private InputStream retrieveStream(String url) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = null;
httpGet = new HttpGet(url);
HttpResponse httpResponse = null;
try {
httpResponse = client.execute(httpGet);
HttpEntity getResponseEntity = httpResponse.getEntity();
return getResponseEntity.getContent();
} catch (IOException e) {
httpGet.abort();
}
return null;
}
@Override
protected ArrayList<Entry> doInBackground(Void... params) {
InputStream source = retrieveStream(mUrl);
Reader reader = null;
try {
reader = new InputStreamReader(source);
} catch (Exception e) {
return null;
}
Gson gson = new Gson();
SearchResult result = gson.fromJson(reader,SearchResult.class);
return result.getFeed().getEntry();
}
protected void onPostExecute(ArrayList<Entry> entries) {
mAdapter.upDateEntries(entries);
}
}
Listing 5:
ImageListAdapter utilisé pour remplir ListView avec des données et des images -
public class ImageListAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mLayoutInflater;
private ArrayList<Entry> mEntries = new ArrayList<Entry>();
private final ImageDownloader mImageDownloader;
public ImageListAdapter(Context context) {
mContext = context;
mLayoutInflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mImageDownloader = new ImageDownloader(context);
}
@Override
public int getCount() {
return mEntries.size();
}
@Override
public Object getItem(int position) {
return mEntries.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
RelativeLayout itemView;
if (convertView == null) {
itemView = (RelativeLayout) mLayoutInflater.inflate(
R.layout.list_item, parent, false);
} else {
itemView = (RelativeLayout) convertView;
}
ImageView imageView = (ImageView)
itemView.findViewById(R.id.listImage);
TextView titleText = (TextView)
itemView.findViewById(R.id.listTitle);
TextView descriptionText = (TextView)
itemView.findViewById(R.id.listDescription);
String imageUrl = mEntries.get(position).getContent().getSrc();
mImageDownloader.download(imageUrl, imageView);
String title = mEntries.get(position).getTitle().get$t();
titleText.setText(title);
String description =
mEntries.get(position).getSummary().get$t();
if (description.trim().length() == 0) {
description = "Sorry, no description for this image.";
}
descriptionText.setText(description);
return itemView;
}
public void upDateEntries(ArrayList<Entry> entries) {
mEntries = entries;
notifyDataSetChanged();
}
}
Grande ! De cette façon, vous allez charger des données dynamiques du serveur et les afficher dans une liste. Évidemment, vous pouvez en changer une partie ou plus pour l'ajouter à votre application. À la votre!
Cela ressemble à un cas d'école pour un 'ListView'. Avez-vous envisagé d'en utiliser un à la place? – matiash
Je l'ai fait, mais il ne convient pas tout à fait à mon cas d'utilisation pour quelques raisons. Dans ce cas, j'ai un ScrollView qui contient un LinearLayout, dans lequel je voudrais insérer le code ci-dessus pour chaque élément tiré de ma base de données. – opticon
Cela ressemble toujours à un cas d'école pour un 'ListView' ... :) Eh bien, techniquement l'approche que vous décrivez fonctionnerait, mais elle ressemble tellement à ce que ListView fait déjà (et probablement plus efficacement, par exemple ne pas créer tout vues des enfants, les réutiliser, & c). – matiash