Android 动态列表视图添加";“加载更多项目”;在卷轴的末尾
我有一个listview,它通过Json从sqlite数据库获取数据 我想将其转换为动态listview,在滚动的最后,在加载更多项目并将其添加到适配器(例如每次10个项目)时,列表的页脚会显示“加载更多项目”。我在实现此功能时遇到问题。请帮帮我。谢谢Android 动态列表视图添加";“加载更多项目”;在卷轴的末尾,android,listview,dynamic-loading,Android,Listview,Dynamic Loading,我有一个listview,它通过Json从sqlite数据库获取数据 我想将其转换为动态listview,在滚动的最后,在加载更多项目并将其添加到适配器(例如每次10个项目)时,列表的页脚会显示“加载更多项目”。我在实现此功能时遇到问题。请帮帮我。谢谢 public class AllProductsActivity extends Activity { ... defining variables...; @Override public void onCreate(Bundle save
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;
}
}
}
公共类AllProductsActivity扩展活动{
…定义变量。。。;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
新建LoadAllProducts().execute();
}
类LoadAllProducts扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
…进度对话框。。。
}
受保护的字符串doInBackground(字符串…args){
countryList=新的ArrayList();
List params=new ArrayList();
JSONObject json=jParser.makeHttpRequest(url_all_products,“GET”,params);
Log.d(“所有产品:,json.toString());
试一试{
//检查成功标签
int success=json.getInt(TAG_success);
如果(成功==1){
//发现的产品
//获取一系列产品
products=json.getJSONArray(TAG_products);
//在所有产品中循环
对于(int i=0;i
您可以尝试以下代码
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()。并调用notifydatasetchanged
。它应该可以工作。有了解决方案,活动必须实现界面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);
}
}
base\u list\u item\u loading\u 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>
我希望它能有所帮助。实现动态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.setVisibility(View.VISIBLE);
onPostExecute
footer.setVisibility(View.GONE);
我是否应该定义第一个可见项
,可见项计数
和总项计数
?我是否应该这样定义它们:int first visible item=1;int visibleitemcount=10;int totalitemcount=45?否。当您滚动列表时,将调用onScroll。您将获得firstvisible item等的值。。你不必给他们下定义,谢谢。你的意思是我在我的php文件中使用了限制1,10,这是应用程序发布到服务器的1(表示第一页),对于每次加载,我都有计数+最后一页的数量,例如,我的应用程序将数字5发送到服务器,这次它发送5*10,10进行加载。是否正确?这将连续无限次地调用add items函数..如果您的项目在应用程序中停留在同一位置,即最后一个项目是否可见。请提供以下函数setItems();
footer.setVisibility(View.VISIBLE);
footer.setVisibility(View.GONE);