Bonjour,
Je récupère des articles de mon site Web que je récupère grâce à Json et que je met dans une ListView avec un Adapter personnalisé. Par défaut j'affiche les 5 premiers articles. J'aimerais que lorsque l'on arrive à la fin de la ListView donc à la fin du dernière article, 5 nouveaux items apparaissent dynamiquement. J'ai trouvé un exemple sur Internet (voir code) mais je n'arrive pas à le mettre en place dans mon cas. Pourriez-vous m'aider ? Merci.
Mon Activité :
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85 package com.applicazione; import java.util.ArrayList; import java.util.HashMap; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.applicazione.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.Window; import android.widget.AdapterView; import android.widget.ListView; import android.widget.AdapterView.OnItemClickListener; public class Bastia1905Activity extends Activity { /** Called when the activity is first created. */ private myBaseAdapter adapter = null; private ListView lv; int itemPerPage = 5; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.attualita); ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); JSONObject json = JSONfunctions.getJSONfromURL("http://bastia1905.com/android/export_android.php?nb_article="+itemPerPage); try{ JSONArray earthquakes = json.getJSONArray("articles"); for(int i=0;i<earthquakes.length();i++){ HashMap<String, String> map = new HashMap<String, String>(); JSONObject e = earthquakes.getJSONObject(i); map.put("id", String.valueOf(i)); map.put("titre", e.getString("titre")); map.put("extrait", e.getString("extrait")); map.put("thumb", e.getString("thumb")); map.put("date", e.getString("date")); map.put("img_article", e.getString("img_article")); map.put("detail", e.getString("detail")); mylist.add(map); } }catch(JSONException e) { Log.e("log_tag", "Error parsing data "+e.toString()); } adapter = new myBaseAdapter(this,this,mylist); lv = (ListView)findViewById(R.id.list); lv.setAdapter(adapter); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @SuppressWarnings("unchecked") HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position); // Nous définissons notre intent en lui disant quelle classe il faut utiliser Intent affichearticle = new Intent(getApplicationContext(),ArticleActivity.class); affichearticle.putExtra("titre", o.get("titre")); affichearticle.putExtra("detail", o.get("detail")); affichearticle.putExtra("img_article", o.get("img_article")); // On appelle l'activity startActivity(affichearticle); } }); } }
Exemple de ListView avec chargement dynamique
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
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 package com.never; import java.util.ArrayList; import java.util.Calendar; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class NeverEndingActivity extends Activity { //how many to load on reaching the bottom int itemsPerPage = 5; boolean loadingMore = false; ArrayList<String> myListItems; ArrayAdapter<String> adapter; //For test data :-) Calendar d = Calendar.getInstance(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listplaceholder); //This will hold the new items myListItems = new ArrayList<String>(); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myListItems); ListView list = (ListView)findViewById(R.id.list); //add the footer before adding the adapter, else the footer will nod load! View footerView = ((LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listfooter, null, false); list.addFooterView(footerView); //Set the adapter list.setAdapter(adapter); //Here is where the magic happens list.setOnScrollListener(new OnScrollListener(){ //useless here, skip! public void onScrollStateChanged(AbsListView view, int scrollState) {} //dumdumdum public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //what is the bottom iten that is visible int lastInScreen = firstVisibleItem + visibleItemCount; //is the bottom item visible & not loading more already ? Load more ! if((lastInScreen == totalItemCount) && !(loadingMore)){ Thread thread = new Thread(null, loadMoreListItems); thread.start(); } } }); //Load the first 15 items Thread thread = new Thread(null, loadMoreListItems); thread.start(); } //Runnable to load the items private Runnable loadMoreListItems = new Runnable() { public void run() { //Set flag so we cant load new items 2 at the same time loadingMore = true; //Reset the array that holds the new items myListItems = new ArrayList<String>(); //Simulate a delay, delete this on a production environment! try { Thread.sleep(1000); } catch (InterruptedException e) {} //Get 15 new listitems for (int i = 0; i < itemsPerPage; i++) { //Fill the item with some bogus information myListItems.add("Date: " + (d.get(Calendar.MONTH)+ 1) + "/" + d.get(Calendar.DATE) + "/" + d.get(Calendar.YEAR) ); // +1 day :-D d.add(Calendar.DATE, 1); } //Done! now continue on the UI thread runOnUiThread(returnRes); } }; //Since we cant update our UI from a thread this Runnable takes care of that! private Runnable returnRes = new Runnable() { public void run() { //Loop thru the new items and add them to the adapter if(myListItems != null && myListItems.size() > 0){ for(int i=0;i<myListItems.size();i++) adapter.add(myListItems.get(i)); } ; //Tell to the adapter that changes have been made, this will cause the list to refresh adapter.notifyDataSetChanged(); //Done loading more. loadingMore = false; } }; }
Partager