237 votes

Adaptateur personnalisé pour la vue en liste

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 ?

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

336voto

Rakhita Points 1463
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);

1 votes

Merci pour le code Pouvez-vous expliquer la méthode getView, c'est-à-dire ce qu'elle doit contenir ?

3 votes

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).

2 votes

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 ?

38voto

Louis Morda Points 366

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>

0 votes

@YoushaAleayoub exist ordinal for Enum.. in java & kotlin

10voto

Videre Points 3214

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

2 votes

Semble être en panne (404), savez-vous où il se cache maintenant ?

0 votes

@hotzen Je viens de vérifier les liens, et ils sont tous les deux toujours en place. Peut-être y a-t-il eu un problème de votre côté ?

1 votes

Il n'y a pas d'exemple de "EfficientAdapter".

6voto

Rakhita Points 1463

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 ).

5voto

Felix Points 33944

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 :).

0 votes

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é.

0 votes

Google est mon ami parce que quelqu'un pose des questions et quelqu'un répond. si personne ne pose de questions google ne peut pas être mon ami. donc s'il vous plaît arrêtez de dire cela.

Prograide.com

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.

Powered by:

X