Listview Lade mehr footer

  • Antworten:8
  • Bentwortet
Kinq__#
  • Forum-Beiträge: 47

24.07.2013, 13:08:31 via Website

Hallo zusammen

Ich habe eine Listview und sehr viele Daten. Ich möchte das nur 20 angezeigt werden und dann weiter 20 wenn ich zu unterst bin. Ich habe leider nur Tutorials auf Englisch gefunden, da mein Englisch für das nicht ausreichte suche ich ein Deutsche TUT, oder jemand von euch kann mir das erklären.
Bedanke mich schon jetzt und freue mich über eure hilfe.

mfg

Kinq__#(Kevin)

Antworten
ajendros
  • Forum-Beiträge: 3

26.07.2013, 09:28:43 via Website

[quote=Kinq__#]Hallo zusammen

Ich habe eine Listview und sehr viele Daten. Ich möchte das nur 20 angezeigt werden und dann weiter 20 wenn ich zu unterst bin. Ich habe leider nur Tutorials auf Englisch gefunden, da mein Englisch für das nicht ausreichte suche ich ein Deutsche TUT, oder jemand von euch kann mir das erklären.
Bedanke mich schon jetzt und freue mich über eure hilfe.

Soweit ich weiss kann das ListView nicht, weil du die View nur einmal mit einem Adapter z.B ArrayAdapter füllen kannst.
Ausser du implementiert die einen eigenen Adapter.

Anstelle dich damit zu beschäftigen würde ich eher zu sehen das Ich ViewHolder benutzen würde, um keine Performance probleme zu bekommen.

Antworten
impjor
  • Forum-Beiträge: 1.793

26.07.2013, 11:24:13 via App

Wo ist überhaupt der Sinn der gesamten Aktion?
Verstehe nicht, was du damit bezwecken willst. Beschreibe doch mal was das in deiner App werden soll.
LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

26.07.2013, 13:23:45 via Website

Ich vermute es geht ihm um die Performance und die Speicherbelastung, wenn er zB 10000 Einträge statisch in seine Liste einträgt.

Die Lösung wäre ggf ein CursorAdapter, sofern seine "vielen" Daten in einer Datenbank vorliegen.

Antworten
Kinq__#
  • Forum-Beiträge: 47

26.07.2013, 14:24:56 via Website

impjor
Wo ist überhaupt der Sinn der gesamten Aktion?
Verstehe nicht, was du damit bezwecken willst. Beschreibe doch mal was das in deiner App werden soll.
LG
Meine App ist eine Witze App, die Witze werden auf einem MySQL server gespeichert. In den Kategorien lade ich die Witze, das geht auch aber alle auf einmal. Ich will das man nach unten scrollt und wenn die ersten 20 fertig sind eine meldung "Lade mehr" anzeigt und weiter 20 aus der DB holt.
Ich hole sie mit dem AsyncTask aus der DB mit PHP und wandle sie in JSON um.

Antworten
Manuel Barwig
  • Forum-Beiträge: 15

26.07.2013, 17:33:20 via Website

Hey,
wird der Footer schon angezeigt und hast Du schon ein Click Listener eingefügt?
1View footer = getLayoutInflater().inflate(R.layout.list_footer,null); //Eigenes Layout, dass bspw. ein TextView mit "Lade mehr" beinhaltet.
2listView.addFooterView(footer);
3footer.setOnClickListener(new View.OnClickListener() { //Kann auch im Layout gesetzt werden
4 @Override
5 public void onClick(View v) {
6 // TODO Auto-generated method stub
7 }
8 });
Layout
1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="horizontal"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent">
6 <TextView
7 android:id="@+id/single_footer"
8 android:layout_width="wrap_content"
9 android:layout_height="wrap_content"
10 android:gravity="left"
11 android:layout_gravity="left"
12 android:textColor="@android:color/secondary_text_light_nodisable"
13 android:textSize="16sp"
14 android:text="@string/button_new"/>
15</LinearLayout>
Durch den Listener sollten die Daten geladen und der Adapter benachrichtigt werden, dass Daten hinzugefügt wurden (adapter.notifyDataSetChanged())

Ich weiß nicht, ob sich die Daten in Deinem Anwendungsfall oft ändern und welche Datenmengen übertragen werden. So kann es besser sein, dass die Daten auf dem Gerät gespeichert werden und eine Aktualisierungsfunktion implementiert wird. Durch das Aktualisieren werden nur die neuen/geänderten Daten abgerufen. Dadurch kann die Übertragungsmenge reduziert werden. Desweiteren könntest Du eine Suchfunktion innerhalb der Liste implementieren.

Am besten wäre es, wenn Du die relevanten Klassen postest. Dann müssen wir nicht Rätseln wie weit du bist, welchen Adapter du hast etc.

Grüße
Manuel

Antworten
Kinq__#
  • Forum-Beiträge: 47

26.07.2013, 19:44:39 via Website

Manuel Barwig
Hey,
Am besten wäre es, wenn Du die relevanten Klassen postest. Dann müssen wir nicht Rätseln wie weit du bist, welchen Adapter du hast etc.
1public class categoryActivity extends ListActivity {
2
3 String cat;
4
5 // Progress Dialog
6 private ProgressDialog pDialog;
7
8 // Session Manager Class
9 SessionManager session;
10
11 // Creating JSON Parser object
12 JSONParser jsonParser = new JSONParser();
13
14 ArrayList<HashMap<String, String>> jokeList;
15
16 // url to get all jokes list
17 private static String url_all_category = "http://............./get_category_details.php";
18
19 // JSON Node names
20 private static final String TAG_SUCCESS = "success";
21 private static final String TAG_CATEGORIES = "joke";
22 private static final String TAG_CID = "cid";
23 private static final String TAG_NAME = "name";
24 private static final String TAG_JOKE = "joke";
25 private static final String TAG_JID = "jid";
26 private static final String TAG_OWN = "own";
27 private static final String TAG_DATE = "date";
28 private static final String TAG_OID = "oid";
29 private static final String TAG_OWN_ID = "own_id";
30
31 // jokes JSONArray
32 JSONArray jokes = null;
33
34 @Override
35 public void onCreate(Bundle savedInstanceState) {
36 super.onCreate(savedInstanceState);
37 setContentView(R.layout.main);
38
39 // Hashmap for ListView
40 jokeList = new ArrayList<HashMap<String, String>>();
41
42 session = new SessionManager(getApplicationContext());
43
44 // Get listview
45 ListView lv = getListView();
46
47 // Loading jokes in Background Thread
48 new LoadAllJokes().execute();
49
50 lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
51 @Override
52 public void onItemClick(AdapterView<?> arg0, View view, int arg2,
53 long arg3) {
54 /*DATEN VON GEKLICKETES ELEMENT FÜR NÄCHSTE ACTIVITY BEREITSTELLEN*/
55 }
56 });
57
58 }
59
60 /**
61 * Background Async Task to Load all product by making HTTP Request
62 * */
63 class LoadAllJokes extends AsyncTask<String, String, String> {
64
65 /**
66 * Before starting background thread Show Progress Dialog
67 * */
68 @Override
69 protected void onPreExecute() {
70 super.onPreExecute();
71 pDialog = new ProgressDialog(categoryActivity.this);
72 pDialog.setMessage("Lade Witze. Bitte warten...");
73 pDialog.setIndeterminate(false);
74 pDialog.setCancelable(false);
75 pDialog.show();
76 }
77
78 /**
79 * getting All jokes from url
80 * */
81 protected String doInBackground(String... args) {
82 // Building Parameters
83 List<NameValuePair> params = new ArrayList<NameValuePair>();
84
85 // get user data from session
86 HashMap<String, String> user = session.getUserDetails();
87 String username = user.get(SessionManager.KEY_NAME);
88
89 params.add(new BasicNameValuePair("name", cat));
90 params.add(new BasicNameValuePair("username", username));
91 // getting JSON string from URL
92 JSONObject json = jsonParser.makeHttpRequest(
93 url_all_category, "GET", params);
94
95 // log cat for JSON reponse
96 Log.d("All joke_cat: ", json.toString());
97
98 try {
99 // Checking for SUCCESS TAG
100 int success = json.getInt(TAG_SUCCESS);
101 if (success == 1) {
102 // JOKE FOUND
103 // Getting Array
104 jokes = json.getJSONArray(TAG_CATEGORIES);
105
106
107 // looping through All Joke
108 for (int i = 0; i < jokes.length(); i++) {
109 JSONObject c = jokes.getJSONObject(i);
110
111 // Storing each json item in variable
112 String id = c.getString(TAG_JID);
113 String name = c.getString(TAG_JOKE);
114 String own = c.getString(TAG_OWN);
115 String date = c.getString(TAG_DATE);
116 String own_id = c.getString(TAG_OWN_ID);
117
118 // creating new HashMap
119 HashMap<String, String> map = new HashMap<String, String>();
120
121 // adding each child node to HashMap key => value
122 map.put(TAG_JID, id);
123 map.put(TAG_JOKE, name);
124 map.put(TAG_OWN, own);
125 map.put(TAG_DATE, date);
126 map.put(TAG_OWN_ID, own_id);
127
128 // adding HashList to ArrayList
129 jokeList.add(map);
130 }
131 } else {
132 // no joke found
133 }
134 } catch (JSONException e) {
135 e.printStackTrace();
136 }
137 return null;
138 }
139
140 /**
141 * After completing background task Dismiss the progress dialog
142 * **/
143 protected void onPostExecute(String file_url) {
144 // dismiss the dialog after getting all joke
145 pDialog.dismiss();
146 // updating UI from Background Thread
147 runOnUiThread(new Runnable() {
148 public void run() {
149 /**
150 * Updating parsed JSON data into ListView
151 * */
152 ListAdapter adapter = new SimpleAdapter(
153 categoryActivity.this, jokeList,
154 R.layout.joke_list_item, new String[] { TAG_JID,
155 TAG_JOKE, TAG_OWN, TAG_DATE, TAG_OWN_ID},
156 new int[] { R.id.pid, R.id.name, R.id.own, R.id.date, R.id.own_id });
157 // updating listview
158 setListAdapter(adapter);
159 }
160 });
161
162 }
163
164 }
165}
Ich habe jetzt mal Sachen raus gelöscht wo nichts damit zutun hat.

Antworten
Andy N.
  • Forum-Beiträge: 3.112

26.07.2013, 20:25:38 via Website

Man überprüft ob das letzte Element (ein statisches, mit z.B. "Mehr Witze" ) nach einem Scroll Event angezeigt wird und lädt dann weitere Daten nach.
Man sollte dabei aber recht viel beachten, was es am Ende aufwendig macht. Es gibt auch schon fertige Lösungen, such einfach mal nach cwac-endless.
Die Dokumentation ist auch auf Englisch, Du kannst Dir aber ja mal die Demo anschaun und versuchen, ob Du die verstehst.

Antworten
Kinq__#
  • Forum-Beiträge: 47

02.08.2013, 23:09:26 via Website

Habe es hin bekommen mit probieren, Danke für eure mithilfe
Das mit dem cwac-endless ging bei mir nichts hatte immer eine Fehlermeldung.

— geändert am 04.08.2013, 11:13:47

Antworten