Je veux créer un custom adapter
pour ma vue en liste. Existe-t-il un article qui m'explique comment en créer un et comment il fonctionne ?
Merci pour le code Pouvez-vous expliquer la méthode getView, c'est-à-dire ce qu'elle doit contenir ?
Je veux créer un custom adapter
pour ma vue en liste. Existe-t-il un article qui m'explique comment en créer un et comment il fonctionne ?
public class ListAdapter extends ArrayAdapter<Item> {
private int resourceLayout;
private Context mContext;
public ListAdapter(Context context, int resource, List<Item> items) {
super(context, resource, items);
this.resourceLayout = resource;
this.mContext = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi;
vi = LayoutInflater.from(mContext);
v = vi.inflate(resourceLayout, null);
}
Item p = getItem(position);
if (p != null) {
TextView tt1 = (TextView) v.findViewById(R.id.id);
TextView tt2 = (TextView) v.findViewById(R.id.categoryId);
TextView tt3 = (TextView) v.findViewById(R.id.description);
if (tt1 != null) {
tt1.setText(p.getId());
}
if (tt2 != null) {
tt2.setText(p.getCategory().getId());
}
if (tt3 != null) {
tt3.setText(p.getDescription());
}
}
return v;
}
}
C'est une classe que j'avais utilisée pour mon projet. Vous devez avoir une collection de vos éléments que vous voulez afficher, dans mon cas c'est <Item>
. Vous devez passer outre View getView(int position, View convertView, ViewGroup parent)
méthode.
R.layout.itemlistrow
définit la ligne de l ListView
.
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:orientation="vertical"
android:layout_width="fill_parent">
<TableRow android:layout_width="fill_parent"
android:id="@+id/TableRow01"
android:layout_height="wrap_content">
<TextView android:textColor="#FFFFFF"
android:id="@+id/id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="id" android:textStyle="bold"
android:gravity="left"
android:layout_weight="1"
android:typeface="monospace"
android:height="40sp" />
</TableRow>
<TableRow android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TextView android:textColor="#FFFFFF"
android:id="@+id/categoryId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="categoryId"
android:layout_weight="1"
android:height="20sp" />
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_weight="1"
android:textColor="#FFFFFF"
android:gravity="right"
android:id="@+id/description"
android:text="description"
android:height="20sp" />
</TableRow>
</TableLayout>
Dans le MainActivity
définir ListView
comme ça,
ListView yourListView = (ListView) findViewById(R.id.itemListView);
// get data from the table by the ListAdapter
ListAdapter customAdapter = new ListAdapter(this, R.layout.itemlistrow, List<yourItem>);
yourListView .setAdapter(customAdapter);
Merci pour le code Pouvez-vous expliquer la méthode getView, c'est-à-dire ce qu'elle doit contenir ?
Il n'est pas nécessaire de garder la collection appelée items dans votre classe, vous la passez au super constructeur. Les éléments peuvent être récupérés par la méthode getItem(int pos).
Pourquoi coder en dur l'ID de la ressource dans getView alors qu'il est transmis via le constructeur ? Y a-t-il un moyen de récupérer celui qui est fourni lors de la construction ?
Je sais qu'on a déjà répondu à cette question... mais je voulais donner un exemple plus complet.
Dans mon exemple, le ListActivity
qui affichera notre ListView
s'appelle OptionsActivity
car dans mon projet, cette Activity
va afficher les différentes options que mon utilisateur peut définir pour contrôler mon application. Il y a deux types d'éléments de liste, un type d'élément de liste a juste un TextView
et le deuxième type d'élément de liste a juste un Button
. Vous pouvez placer tous les widgets que vous voulez dans chaque type d'élément de liste, mais j'ai gardé cet exemple simple.
Le site getItemView()
vérifie quels éléments de la liste doivent être de type 1 ou de type 2. Selon les ints statiques que j'ai définis plus haut, les 5 premiers éléments de la liste seront de type 1, et les 5 derniers de type 2. Donc, si vous compilez et exécutez cette commande, vous aurez un fichier de type ListView
qui a cinq articles qui contiennent juste un Button
et ensuite cinq éléments qui contiennent simplement un TextView
.
Vous trouverez ci-dessous le Activity
le fichier xml de l'activité, et un fichier xml pour chaque type d'élément de liste.
OptionsActivity.java :
public class OptionsActivity extends ListActivity {
private static final int LIST_ITEM_TYPE_1 = 0;
private static final int LIST_ITEM_TYPE_2 = 1;
private static final int LIST_ITEM_TYPE_COUNT = 2;
private static final int LIST_ITEM_COUNT = 10;
// The first five list items will be list item type 1
// and the last five will be list item type 2
private static final int LIST_ITEM_TYPE_1_COUNT = 5;
private MyCustomAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAdapter = new MyCustomAdapter();
for (int i = 0; i < LIST_ITEM_COUNT; i++) {
if (i < LIST_ITEM_TYPE_1_COUNT)
mAdapter.addItem("item type 1");
else
mAdapter.addItem("item type 2");
}
setListAdapter(mAdapter);
}
private class MyCustomAdapter extends BaseAdapter {
private ArrayList<String> mData = new ArrayList<String>();
private LayoutInflater mInflater;
public MyCustomAdapter() {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(final String item) {
mData.add(item);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if(position < LIST_ITEM_TYPE_1_COUNT)
return LIST_ITEM_TYPE_1;
else
return LIST_ITEM_TYPE_2;
}
@Override
public int getViewTypeCount() {
return LIST_ITEM_TYPE_COUNT;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public String getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if (convertView == null) {
holder = new ViewHolder();
switch(type) {
case LIST_ITEM_TYPE_1:
convertView = mInflater.inflate(R.layout.list_item_type1, null);
holder.textView = (TextView)convertView.findViewById(R.id.list_item_type1_text_view);
break;
case LIST_ITEM_TYPE_2:
convertView = mInflater.inflate(R.layout.list_item_type2, null);
holder.textView = (TextView)convertView.findViewById(R.id.list_item_type2_button);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.textView.setText(mData.get(position));
return convertView;
}
}
public static class ViewHolder {
public TextView textView;
}
}
activity_options.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ListView
android:id="@+id/optionsList"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
liste_item_type_1.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_item_type1_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/list_item_type1_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Text goes here" />
</LinearLayout>
liste_item_type2.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_item_type2_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/list_item_type2_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button text goes here" />
</LinearLayout>
Google propose un exemple appelé EfficientAdapter, qui, à mon avis, est le meilleur exemple simple de mise en œuvre d'adaptateurs personnalisés. http://developer.Android.com/resources/samples/ApiDemos/src/com/example/Android/apis/view/List14.html @CommonsWare a écrit une bonne explication des modèles utilisés dans l'exemple ci-dessus. http://commonsware.com/Android/excerpt.pdf
Vérifiez ce lien , en très simple via le convertView
nous pouvons obtenir la mise en page d'une ligne qui sera affichée dans la vue de liste (qui est l'interface de l'utilisateur). parentView
).
View v = convertView;
if (v == null) {
LayoutInflater vi;
vi = LayoutInflater.from(getContext());
v = vi.inflate(R.layout.itemlistrow, null);
}
en utilisant la position, vous pouvez obtenir les objets de la List<Item>
.
Item p = items.get(position);
après cela, nous devrons définir les détails souhaités de l'objet aux widgets de formulaire identifiés.
if (p != null) {
TextView tt = (TextView) v.findViewById(R.id.id);
TextView tt1 = (TextView) v.findViewById(R.id.categoryId);
TextView tt3 = (TextView) v.findViewById(R.id.description);
if (tt != null) {
tt.setText(p.getId());
}
if (tt1 != null) {
tt1.setText(p.getCategory().getId());
}
if (tt3 != null) {
tt3.setText(p.getDescription());
}
}
alors il renverra la vue construite qui sera attachée à l'objet parentView
(qui est un ListView
/ GridView
).
Vous pouvez jeter un coup d'œil à cet échantillon dans les ApiDemos officiels. Il montre comment étendre BaseAdapter
et l'appliquer à un ListView
. Après cela, il suffit de regarder la référence pour BaseAdapter
et essayez de comprendre ce que fait chaque méthode (y compris les méthodes héritées) et quand/comment l'utiliser.
Aussi, Google est votre ami :).
Oui, Google est l'ami, mais le problème est que les résultats que vous obtenez sont des conneries sur l'utilisation d'arrayadapter etc. Si je n'avais pas su par expérience que je cherchais "quel était le nom de l'adaptateur de base", j'aurais maintenant fait un adaptateur arraylist inutilement compliqué.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Ce code fonctionne très bien androidexample.com/
0 votes
@Houcine Ce lien n'est plus disponible.
0 votes
@choz : je ne trouve pas où j'ai mentionné le lien, vous pouvez le googler, il suffit de taper "ListView with custom rows in Android" et vous trouverez beaucoup de tutoriels utiles ;) . bonne chance