dynamic列表视图添加“加载更多的项目”在滚动结束

我有一个列表视图是由Json从sqlite数据库中获取数据。

我想把它变成dynamic列表视图,在滚动结束时,在加载更多项目并将它们添加到适配器(例如每次10个项目)时,在列表的页脚中出现“加载更多项目”。 我在实现这个function时遇到了问题。 请帮助我。 谢谢。

public class AllProductsActivity extends Activity { ... defining variables...; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new LoadAllProducts().execute(); } class LoadAllProducts extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); ... progress dialog... } protected String doInBackground(String... args) { countryList = new ArrayList<Country>(); List<NameValuePair> params = new ArrayList<NameValuePair>(); JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params); Log.d("All Products: ", json.toString()); try { // Checking for SUCCESS TAG int success = json.getInt(TAG_SUCCESS); if (success == 1) { // products found // Getting Array of Products products = json.getJSONArray(TAG_PRODUCTS); // looping through All Products for (int i = 0; i < products.length(); i++) { JSONObject c = products.getJSONObject(i); // Storing each json item in variable String id = c.getString(TAG_PID); String name = c.getString(TAG_NAME); String description = c.getString(TAG_DESCRIPTION); String due_date = c.getString(TAG_DUE_DATE); String staff = c.getString(TAG_STAFF); String status = c.getString(TAG_STATUS); country = new Country(id,name,description, due_date, staff, status); countryList.add(country); } } } catch (JSONException e) { e.printStackTrace(); } return null; } protected void onPostExecute(String file_url) { pDialog.dismiss(); runOnUiThread(new Runnable() { public void run() { displayListView(); } }); } } private void displayListView() { dataAdapter = new MyCustomAdapter(this, R.layout.country_info, countryList); ListView listView = (ListView) findViewById(R.id.listView1); listView.setAdapter(dataAdapter); } private class MyCustomAdapter extends ArrayAdapter<Country> { ... blah blah blah ... @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; Log.v("ConvertView", String.valueOf(position)); if (convertView == null) { ... blah blah blah ... } return convertView; } } } 

你尝试下面的代码

 list.setOnScrollListener(new OnScrollListener() { public void onScrollStateChanged(AbsListView view, int scrollState) { } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0) { if(flag_loading == false) { flag_loading = true; additems(); } } } }); 

additem()将下面的10个项目添加到数组列表中,并将flag_loading设置为false 。 并呼吁notifydatasetchanged 。 它应该工作。

有解决scheme,Activity必须实现接口AbsListView.OnScrollListener

在活动中:

 int currentFirstVisibleItem = 0; int currentVisibleItemCount = 0; int totalItemCount = 0; int currentScrollState = 0; boolean loadingMore = false; Long startIndex = 0L; Long offset = 10L; View footerView; @Override public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { this.currentFirstVisibleItem = firstVisibleItem; this.currentVisibleItemCount = visibleItemCount; this.totalItemCount = totalItemCount; } @Override public void onScrollStateChanged(AbsListView absListView, int scrollState) { this.currentScrollState = scrollState; this.isScrollCompleted(); } private void isScrollCompleted() { if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE && this.totalItemCount == (currentFirstVisibleItem + currentVisibleItemCount)) { /*** In this way I detect if there's been a scroll which has completed ***/ /*** do the work for load more date! ***/ if (!loadingMore) { loadingMore = true; new LoadMoreItemsTask(this).execute(); } } } private class LoadMoreItemsTask extends AsyncTask<Void, Void, List<ListItem>> { private Activity activity; private View footer; private LoadMoreItemsTask(Activity activity) { this.activity = activity; loadingMore = true; footer = activity.getLayoutInflater().inflate(R.layout.base_list_item_loading_footer, null); } @Override protected void onPreExecute() { list.addFooterView(footer); list.setAdapter(adapter); super.onPreExecute(); } @Override protected List<ListItem> doInBackground(Void... voids) { return getNextItems(startIndex, offset); } @Override protected void onPostExecute(List<ListItem> listItems) { if (footer != null) { list.removeFooterView(footer); } list.setAdapter(adapter); loadingMore = false; if (listItems.size() > 0) { startIndex = startIndex + listItems.size(); setItems(listItems); } super.onPostExecute(listItems); } } 

在OnCreate:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.base_list); list = (ListView) findViewById(R.id.list); list.setOnItemClickListener(this); list.setOnScrollListener(this); footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.base_list_item_loading_footer, null, false); initAdapter(); new LoadMoreItemsTask(this).execute(); } 

base_list_item_loading_footer.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item_footer" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:padding="15dp" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="horizontal" > <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" > </ProgressBar> <TextView style="@style/ItemHeadTextStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="@string/loading_list_items" /> </LinearLayout> </RelativeLayout> 

我希望,这有帮助。

使用页脚实现Dynamic Expandaple LW的最佳方法如下:

 private int firstVisibleItem, visibleItemCount,totalItemCount; expandapleListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScroll(AbsListView view, int firstVisibleItemm, int visibleItemCountt, int totalItemCountt) { firstVisibleItem = firstVisibleItemm; visibleItemCount = visibleItemCountt; totalItemCount = totalItemCountt; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { final int lastItem = firstVisibleItem + visibleItemCount; if (lastItem == totalItemCount && scrollState == SCROLL_STATE_IDLE) { expandapleInt++; new AsyncTask().execute(); //get next 10-20 items(your choice)items } } }); 

页脚执行:

给定下面的XML代码,应该在布局的底部,你的ListView里面… … –

  <RelativeLayout android:layout_width="match_parent" android:layout_height="45dp" android:layout_gravity="center" android:id="@+id/footer"> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toLeftOf="@+id/textView3" android:layout_toStartOf="@+id/textView3"> </ProgressBar> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Loading" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:id="@+id/textView3" /> 

把它绑在你的活动中

 footer = (RelativeLayout) findViewById(R.id.footer); footer.setVisibility(View.GONE); 

onPreExecute

 footer.setVisibility(View.VISIBLE); 

onPostExecute

 footer.setVisibility(View.GONE);