![](/img/trans.png)
[英]Android listview scroll to bottom to load more data from sqlite
[英]ListView load more on scroll bottom
在MainActivity中,我創建了DownloadTask,它通過CustomListAdapter類填充模型類然后listview,但我創建了識別滾動結束的函數,我想將更多項加載到listview。 我正在閱讀和查看互聯網上的代碼,但我無法弄清楚解決這個問題,因為它有點不同。 MainActivity類
public void updateList() {
adap = new CustomListAdapter(this, feedList, null);
feedListView.setAdapter(adap);
feedListView.setOnScrollListener(new OnScrollListener() {
public void onScrollStateChanged(AbsListView view,
int scrollState) { // TODO Auto-generated method stub
int threshold = 1;
int count = feedListView.getCount();
if (scrollState == SCROLL_STATE_IDLE) {
if (feedListView.getLastVisiblePosition() >= count
- threshold) {
mHandler = new Handler();
mIsLoading = true;
Toast.makeText(getApplicationContext(), "END", Toast.LENGTH_LONG).show();
}
}
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
}
public class DownloadFilesTask extends AsyncTask<String, Integer, Void> {
@Override
protected void onProgressUpdate(Integer... values) {
}
@Override
protected void onPostExecute(Void result) {
if (null != feedList) {
updateList();
}
if (progressbar.isShown()) {
progressbar.setVisibility(View.INVISIBLE);
}
}
@Override
protected Void doInBackground(String... params) {
String url = params[0];
// getting JSON string from URL
JSONObject json = getJSONFromUrl(url);
//parsing json data
parseJson(json);
return null;
}}
public JSONObject getJSONFromUrl(String url) {
InputStream is = null;
JSONObject jObj = null;
String json = null;
// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
public void parseJson(JSONObject json) {
try {
// parsing json object
if (json.getString("status").equalsIgnoreCase("ok")) {
JSONArray posts = json.getJSONArray("posts");
feedList = new ArrayList<FeedItem>();
for (int i = 0; i < posts.length(); i++) {
JSONObject post = (JSONObject) posts.getJSONObject(i);
FeedItem item = new FeedItem();
/////.....
feedList.add(item);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
CustomListAdapter
public class CustomListAdapter extends BaseAdapter
{
private int mCount = 25;
private ArrayList<FeedItem> listData;
private LayoutInflater layoutInflater;
private Context mContext;
private ArrayList<String> data;
protected ListView feedListView;
public CustomListAdapter( Context context, ArrayList<FeedItem> listData)
{
this.listData = listData;
layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mContext = context;
}
public void addMoreItems(int count) {
mCount += count;
notifyDataSetChanged();
}
@Override
public int getCount()
{
return mCount;
}
@Override
public Object getItem(int position)
{
return position;
}
@Override
public long getItemId(int position)
{
return position;
}
public View getView( int position, View convertView, ViewGroup parent)
{
final ViewHolder holder;
View row=convertView;
if ((row == null) || (row.getTag()==null)) {
convertView = layoutInflater.inflate(R.layout.list_row_layout, null);
holder = new ViewHolder();
////
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
final FeedItem newsItem = (FeedItem) listData.get(position);
/////
return convertView;
}
static class ViewHolder
{
////
}
}
當我到達底部時,就會創建吐司。
您可以比較位置與列表數據大小,並在適配器類中相應地加載更多項目,而不是使用OnScrollListener。
public View getView( int position, View convertView, ViewGroup parent){
if(position == getCount()-1){
// load new items here. you can do a for loop here, if you'd like to add multiple items.
addMoreItems(newItem);
}
// rest of the getView implementation
}
您還需要更新以下方法:
public void addMoreItems(FeedItem newItem) {
listData.add(newItem); // since you want to add this item at the end of the list
notifyDataSetChanged();
}
@Override
public int getCount(){
return listData.size();
}
@Override
public Object getItem(int position){
return listData.get(position);
}
當您想要更新listView時,不要像在更新方法中那樣創建新的適配器。 如果你這樣做,它將擺脫以前的內容。 相反,只需調用適配器的addMoreItems方法,它就可以為您完成。
@Override
public void onScrollStateChanged(int scrollState) {
// TODO Auto-generated method stub
if(scrollState==RecyclerView.SCROLL_STATE_IDLE){
visibleItemCount = mLayoutManager.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleThreshold) <= (firstVisibleItem + visibleItemCount)) {
Log.v("scroll","Last Item Wow !");
if(footerView.getVisibility()!=View.VISIBLE){
footerView.setVisibility(View.VISIBLE);
}
refreshExpListViewData();
}
}
}
實現“無限滾動”的一種非常簡單的方法是使用EndlessAdapter
庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.