現在、 https: //github.com/thest1/LazyList で Android の Lazylist を使用して、リストビューに画像をロードしています。
私が直面した問題は、読み込まれた画像とデータが最初の 2 ページで正しいことです。3 ページ目に到達すると、ロードされたデータと画像は最初のページと同じになり、その後のページでも問題が続きます。
例:ページ1
そして3ページ目に到達すると、
日付を見て、画像がロードされました。それは同じだ。データは Web サイトから取得され、Web ブラウザーで表示すると、Web サイトは適切にデータを送信しています。
ロードされたデータが繰り返される理由は何ですか?
主な活動
public class MainActivity extends Activity {
XMLParser parser;
Document doc;
String xml;
ListView lv;
ListViewAdapter adapter;
ArrayList<HashMap<String, String>> menuItems;
ProgressDialog pDialog;
int limit = 8;
boolean loadingMore = false;
String URL = "http://test.com/5.php";
// Flag for current page
int current_page = 1;
@Override
public void onPause() {
super.onPause();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onCreate(Bundle savedInstanceState) {
lv = (ListView) findViewById(R.id.list);
menuItems = new ArrayList<HashMap<String, String>>();
parser = new XMLParser();
new firstLoad().execute();
// Getting adapter
adapter = new ListViewAdapter(this, menuItems);
lv.setAdapter(adapter);
lv.setOnScrollListener(new OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int lastInScreen = firstVisibleItem + visibleItemCount;
if ((lastInScreen == totalItemCount) && !(loadingMore)) {
new loadMoreListView().execute();
}
}
});
/**
* Async Task that send a request to url Gets new list view data Appends to
* list view
* */
private class loadMoreListView extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// Showing progress dialog before sending http request
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Please wait..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
protected Void doInBackground(Void... unused) {
loadingMore = true;
// increment current page
current_page += 1;
// Next page request
URL = URL + "?page=" + current_page;
xml = parser.getXmlFromUrl(URL); // getting XML
doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
// looping through all item nodes <item>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(KEY_ID, parser.getValue(e, KEY_ID));
map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
map.put(KEY_IMG, parser.getValue(e, KEY_IMG));
map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
map.put(KEY_WEBSITEURL, parser.getValue(e, KEY_WEBSITEURL));
map.put(KEY_IMAGEURL, parser.getValue(e, KEY_IMAGEURL));
// adding HashList to ArrayList
menuItems.add(map);
}
return (null);
}
protected void onPostExecute(Void unused) {
// closing progress dialog
runOnUiThread(new Runnable() {
public void run() {
// add things to do here
pDialog.dismiss();
// get listview current position - used to maintain scroll
// position
int currentPosition = lv.getFirstVisiblePosition();
Toast.makeText(getApplicationContext(), "Current on page " + String.valueOf(current_page), Toast.LENGTH_SHORT).show();
// Appending new data to menuItems ArrayList
adapter = new ListViewAdapter(MainActivity.this, menuItems);
lv.setAdapter(adapter);
// Setting new scroll position
lv.setSelectionFromTop(currentPosition + 1, 0);
loadingMore = false;
}
});
}
}
private class firstLoad extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// Showing progress dialog before sending http request
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Loading..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
protected Void doInBackground(Void... unused) {
loadingMore = true;
xml = parser.getXmlFromUrl(URL); // getting XML
doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
// looping through all item nodes <item>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(KEY_ID, parser.getValue(e, KEY_ID));
map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
map.put(KEY_IMG, parser.getValue(e, KEY_IMG));
map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
map.put(KEY_WEBSITEURL, parser.getValue(e, KEY_WEBSITEURL));
map.put(KEY_IMAGEURL, parser.getValue(e, KEY_IMAGEURL));
// adding HashList to ArrayList
menuItems.add(map);
}
// Appending new data to menuItems ArrayList
return (null);
}
protected void onPostExecute(Void unused) {
// closing progress dialog
runOnUiThread(new Runnable() {
public void run() {
loadingMore = false;
// add things to do here
pDialog.dismiss();
adapter = new ListViewAdapter(MainActivity.this, menuItems);
lv.setAdapter(adapter);
}
});
}
}
}
最後の質問 :
データが再度ロードされるのを防ぐために、リストビューの状態を保存するコードはありますか? ユーザーがこのアプリを終了するために何度も押し戻し、再度開くと、データはページ 1 から読み込まれます。状態を保存して、ユーザーが以前に中断したところから開くコードはありますか?
ありがとう!