简体   繁体   中英

Dynamic listview adding “Load more items” at the end of scroll in android

I am new to android. In my app I am using listview , and in my listview I have to load 26 records. I decided to load 3 records first; then when I scroll, next 3 records, etc. I want to load using a progress-bar at bottom of listview .

After all records are completed, I need to show no "records available".

Can anybody help me please?

my code:-

public class MainActivity extends Activity {

    ListView listView;
    String[] arrayS = new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p"};
    View footer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.actvity);

        listView = (ListView) findViewById(R.id.load);

        final ArrayList<String> list = new ArrayList<String>();

        for (int i = 0; i < 3; i++) {
            list.add(arrayS[i]);
        }

        //Add footer view:-
        footer = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.progress, null, false);
        listView.addFooterView(footer);

        final ArrayAdapter<String> ad = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, list);
        listView.setAdapter(ad);


        // Implementing scroll refresh:-

        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {
            }

            @Override
            public void onScroll(AbsListView absListView, int firstItem, int visibleItemCount, final int totalItems) {

        });
    }
}

Use the following piece of logic to get when to call next set of data for load more -

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
                     int visibleItemCount, int totalItemCount) {

    int lastInScreen = firstVisibleItem + visibleItemCount;
    if ((lastInScreen == totalItemCount) && !(flagForCheckingIfMoreDataAvailable)) {
        // load more
    }
}

Here is the complete code for do it.

package com.demo;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;

public class Demo extends Activity {

    private ListView listView;
    private String[] arrayS;
    private View footer;
    private boolean moreData = true;
    ArrayList<String> list;
    private ArrayAdapter ad;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);
        listView = (ListView) findViewById(R.id.load);

        list = new ArrayList<String>();

        for (int i = 0; i < 25; i++) {
            list.add("item" + i);
        }

        //Add footer view:-

        footer = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.progress, null, false);
        listView.addFooterView(footer);
        ad = new ArrayAdapter(Demo.this, android.R.layout.simple_list_item_1, list);
        listView.setAdapter(ad);


        // Implementing scroll refresh:-

        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {
            }

            @Override
            public void onScroll(AbsListView absListView, int firstItem, int visibleItemCount, final int totalItems) {

                final int lastItem = firstItem + visibleItemCount;
                if (lastItem == totalItems) {
                    if (moreData) {
                        footer.setVisibility(View.VISIBLE);
                        footer.setPadding(0, 0, 0, 0);
                        Handler handler = new Handler(); // hear is the handler for testing purpose 
                        handler.postDelayed(new Runnable() { // make some delay for check load more view
                            @Override
                            public void run() {
                                getListData();
                            }
                        }, 10000);

                    }

                }
            }

        });

    }

    private void getListData() {
        for (int i = 0; i < 105; i++) {
            list.add("New Item " + i);
        }
        footer.setVisibility(View.GONE);
        footer.setPadding(0, -1 * footer.getHeight(), 0, 0);
        //here above tow line invisible footer after data added
        if (ad != null) {
            ad.notifyDataSetChanged();
        }
    moreData=false; //now after successfully data get you can stop more data.
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM