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
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
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.
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
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
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.
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(); } } }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager