当你到达列表视图的末尾时,似乎有很多方法可以完成运行后台代码,下面的sn-p是我选择实现的:
lv.setOnScrollListener(new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
int threshold = 1;
int count = lv.getCount();
if (scrollState == SCROLL_STATE_IDLE) {
if (lv.getLastVisiblePosition() >= count - threshold) {
items = (AddItems) new AddItems().execute(count);
}
}
}
});
对于 AddItem 类,我想要创建一个自定义数组对象 Gift()
public class Gift {
private String descs;
private String itemName;
private String price;
private String imageUrl;
public Gift() {
}
public Gift(String p, String i, String d, String u) {
this.descs = d;
this.itemName = i;
this.price = p;
this.imageUrl = u;
}
public String getDetails() {
return descs;
}
public void setDetails(String details) {
this.descs = details;
}
} // You get the idea
然后我必须遍历文件,将所需的字符串添加到各自的 ArrayList 中,并将所有三个列表组合成一个 ArrayList<Gift>,如下所示。
private class AddItems extends AsyncTask<Integer, Void, ArrayList<Gift>> {
@Override
protected ArrayList<Gift> doInBackground(Integer... integer) {
try {
amountArray = new ArrayList<String>();
itemArray = new ArrayList<String>();
descArray = new ArrayList<String>();
imageUrls = new ArrayList<String>();
finalArray = new ArrayList<Gift>();
File file = new File(Ids.dir, getString(R.string.html_file));
FileInputStream in = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(
in, "UTF-8"));
String line;
int itemNumber = 0;
while ((line = br.readLine()) != null) {
Document doc = Jsoup.parse(line);
Elements titles = doc.select("h4[class=title]");
Elements amounts = doc.select("div[class=price]");
Elements descs = doc.select("p");
Elements urls = doc.select("img[class=gallery-image]");
for (Element price : amounts) {
itemNumber++;
amountArray.add(price.text());
}
for (Element title : titles) {
itemArray.add(title.text());
}
for (Element desc : descs) {
descArray.add(desc.text());
}
for (Element url : urls) {
imageUrls.add(url.attr("src"));
}
// totalShowing is a final integer with a value of 10
// which only iterates through 10 objects plus
// integer[0], which is the total number of items
// shown in the listview.
if (itemNumber == totalShowing + integer[0] + 1) {
break;
}
}
in.close();
br.close();
finalArray = new ArrayList<Gift>();
// Only add to finalArray the items after position integer[0]
// so we don't add items we've already added
for (int i = integer[0]; i < amountArray.size(); i++) {
finalArray.add(new Gift(amountArray.get(i), itemArray
.get(i), descArray.get(i), imageUrls.get(i)));
}
} catch (Exception e) {
e.printStackTrace();
}
return finalArray;
}
@Override
protected void onPostExecute(ArrayList<Gift> result) {
super.onPostExecute(result);
da.addItems(result);
}
}
之后,我所要做的就是更改我的适配器以扩展 ArrayList<Gift> 并添加以下代码:
public void addItems(ArrayList<Gift> newItems) {
if (null == newItems || newItems.size() <= 0) {
return;
}
if (null == finalArray) {
finalArray = new ArrayList<Gift>();
}
finalArray.addAll(newItems);
notifyDataSetChanged();
}