IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Faire une liste comme celle de FaceBook [FAQ]


Sujet :

Android

  1. #1
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 59
    Points
    59
    Par défaut Faire une liste comme celle de FaceBook
    Bonjour à tous,
    j'aimerai afficher une liste d'objet comme le fait facebook c'est à dire quand l'utilisateur scrolle jusqu'au bas de la liste j'affiche plus d'éléments.
    Merci d'avance

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 169
    Points : 171
    Points
    171
    Par défaut
    Bonsoir,

    Je n'ai pas l'application facebook mais je présume que tu parles de Lazy Loading ?
    Il y a pas mal de tutos/bouts de codes sur internet, personnellement je me suis créé un petit adapter tout simple:

    Code LazyAdapter.java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    package xxx;
     
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
     
    public abstract class LazyAdapter extends BaseAdapter
    {
    	private final static int TYPE_DATA = 0;
    	private final static int TYPE_LOADING = 1;
     
    	private Context context;
    	private Provider provider;
     
    	// Retourne la vue représentant l'objet à la position "position"
    	public abstract View getDataView(int position, View convertView, ViewGroup parent);
     
    	// Retourne le nombre d'objets
    	public abstract int getDataCount();
     
    	public LazyAdapter(Context context, Provider provider) 
    	{
    		super();
    		this.context = context;
    		this.provider = provider;
    	}
     
    	@Override
    	public int getViewTypeCount() 
    	{
    		return 2;
    	}
     
    	@Override
    	public int getItemViewType(int position) 
    	{
    		if (position == getDataCount())
    			return TYPE_LOADING;
    		else
    			return TYPE_DATA;
    	}
     
    	@Override
    	public int getCount() 
    	{
    		int count = getDataCount();
    		if (count > 0 && provider.isDataRemaining())
    			count++;
    		return count;
    	}
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) 
    	{
    		if (getItemViewType(position) == TYPE_LOADING)
    		{
    			View row = convertView;
    			if (row == null || row.findViewById(R.id.widget_element_list_lazy_loading_layout) == null)
    			{
    				row = LayoutInflater.from(getContext()).inflate(R.layout.element_list_lazy_loading, null);
    			}
    			provider.updateLazyData(position - 1);
    			return row;
    		}
    		else
    		{
    			return getDataView(position, convertView, parent);
    		}
    	}
     
    	public Context getContext()
    	{
    		return context;
    	}
     
    	public void setProvider(Provider provider) 
    	{
    		this.provider = provider;
    	}
     
    	@Override
    	public long getItemId(int position) 
    	{
    		return position;
    	}
     
    	public static interface Provider
    	{
    // On demande au Provider de récuperer d'autres objets à afficher
    		public boolean updateLazyData(int position);
    // On se renseigne s'il reste des objets à charger.
    		public boolean isDataRemaining();
    	}
    }

    Code element_list_lazy_loading.xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/widget_element_list_lazy_loading_layout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:gravity="center_horizontal" >
     
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
     
    </LinearLayout>

    Il suffit ensuite d’étendre la classe LazyAdapter et d’implémenter les fonctions:
    public abstract View getDataView(int position, View convertView, ViewGroup parent);
    public abstract int getDataCount();

    et de fournir un Provider lors de la construction de l'Adapter

    Ça reste assez simple comme code mais à toi de le modifier pour tes besoins.

  3. #3
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Très bonne réponse... j'ai a peu pret la même classe utilitaire à base de "Loader" ou d'AsyncTask....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 59
    Points
    59
    Par défaut
    Salut j'ai pas bien compris. En fait qu'est ce que je vais mettre dans ces fonctions? Est ce que vous pouvez m'en donner un exemple pour que j'ai un aperçu. merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 281
    Points : 321
    Points
    321
    Par défaut
    Je te conseille de créer un évènement sur les éléments visibles de la liste.

    Dans cet évènement si tu es bas dans la liste (au déterminer combien) tu rajoute des éléments.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 169
    Points : 171
    Points
    171
    Par défaut
    Voila un petit exemple que je viens de faire.
    Il affiche des nombres aléatoires et en recharge quand on arrive en bas de la liste. Il recharge la liste 9 fois après quoi il signale à l'adapter qu'il n'y a plus de données.
    Code ExempleAdapter : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    public class ExempleAdapter extends LazyAdapter
    {
    	private List<Integer> data;
     
    	public ExempleAdapter(Context context, Provider provider, List<Integer> data) 
    	{
    		super(context, provider);
    		this.data = data;
    	}
     
    	@Override
    	public View getDataView(int position, View convertView, ViewGroup parent) 
    	{
    		View row = convertView;
    		Wrapper wrap;
    		if (convertView == null)
    		{
    			row = LayoutInflater.from(getContext()).inflate(R.layout.element_list_example, null);
    			wrap = new Wrapper(row);
    			row.setTag(wrap);
    		}
    		else
    		{
    			wrap = (Wrapper) row.getTag();
    		}
    		wrap.text.setText(Integer.toString(data.get(position)));
    	}
     
    	@Override
    	public int getDataCount() 
    	{
    		return data.size();
    	}
     
    	private final static class Wrapper
    	{
    		public TextView text;
     
    		public Wrapper(View base)
    		{
    			text = base.findViewById(R.id.element_list_example_text);
    		}
    	}
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    public class ExempleActivity extends Activity implements Provider
    {
    	private List<Integer> integerList;
    	private ExempleAdapter adapter;
    	private Handler handler;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) 
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.exemple);
    		handler = new Handler(this);
    		integerList = new ArrayList<Integer>();
    		adapter = new ExempleAdapter(this, this, integerList);
    		addRandomNumber(); //On remplit une première fois la liste.
    		((ListView) findViewById(R.id.exemple_list)).setAdapter(adapter);
    	}
     
    	public void addRandomNumber() 
    	{
    		for (int i = 0; i < 10; i++)
    		{
    			integerList.add((int) (Math.random() * 100));
    		}
    		adapter.notifyDataSetChanged();
    	}
     
    	@Override
    	public boolean updateLazyData(int position) 
    	{
    		// On vérifie qu'on ne charge pas déjà des données.
    		if (handler.hasMessages(0) == false) 
    		{
    			handler.sendEmptyMessageDelayed(0, 5000); // On simule une requete web.
    		}
    		return true;
    	}
     
    	@Override
    	public boolean isDataRemaining() 
    	{
    // On signal à l'adapter s'il reste ou non des données à charger.
    		return integerList.size() < 100;
    	}
     
    	@Override
    	protected void onDestroy() 
    	{
    		super.onDestroy();
    		handler.removeMessages(0);
    	}
     
    	private final static class Handler extends android.os.Handler
    	{
    		private ExempleActivity activity;
     
    		public Handler(ExempleActivity activity) 
    		{
    			super();
    			this.activity = activity;
    		}
     
    		@Override
    		public void handleMessage(Message msg) 
    		{
    			super.handleMessage(msg);
    			activity.addRandomNumber();
    		}
    	}
    }

Discussions similaires

  1. Faire une liste plus jolie de ma liste:lecture de base mysql
    Par CyberTwister dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/02/2006, 23h31
  2. Comment faire une liste d'évènements ?
    Par WebPac dans le forum Langage
    Réponses: 4
    Dernier message: 16/02/2006, 10h36
  3. [VB]faire une liste
    Par kleen3x dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 19/01/2006, 17h40
  4. Comment faire une liste d'image de choix ?
    Par poussinphp dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/10/2005, 00h34
  5. Faire une liste de device??
    Par jackjack dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2003, 14h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo