2

I am trying to implement infinite scrolling in my app ListView but the results i am getting is that the ListView is getting populated with new data instead of getting appended.

I am getting noclue what's ever ... please help me ... the snippets are

MainActivity.java

public class MainActivity extends FragmentActivity{
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_near_me);
 }
  CityListFragment cityFragment = new CityListFragment();
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, cityFragment).commit();
}

CityListFragment.java

public class CityListFragment extends Fragment {

private List<City> city;
private ListView listView;
CityListAdapter adapter;
ProgressDialog mProgressDialog;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    new MyTask().execute();
}

 public class MyTask extends AsyncTask<String, Void, List<City>> {

    @Override
    protected List<City> doInBackground(String... urls) {
        try {
            city = serviceProvider.getService().getCities();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return city;
    }

    @Override
    protected void onPostExecute(List<City> organization) {
        adapter = new CityListAdapter(getActivity(), city);
        listView.setAdapter(adapter);
        // Create an OnScrollListener
        listView.setOnScrollListener(new AbsListView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view,
                                             int scrollState) { // TODO Auto-generated method stub
                int threshold = 1;
                int count = listView.getCount();

                if (scrollState == SCROLL_STATE_IDLE) {
                    if (listView.getLastVisiblePosition() >= count
                            - threshold) {
                        // Execute LoadMoreDataTask AsyncTask
                        new LoadMoreDataTask().execute();
                    }
                }
            }
        });
    }
}

public class LoadMoreDataTask extends AsyncTask<String, Void, List<City>> {
    @Override
    protected List<City> doInBackground(String... urls) {
        try {
            // web service request
            city = serviceProvider.getService().getNextCities();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return city;
    }

    @Override
    protected void onPostExecute(List<City> organization) {
        int position = listView.getLastVisiblePosition();
        adapter = new CityListAdapter(getActivity(), city);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        listView.setSelectionFromTop(position, 0);
        mProgressDialog.dismiss();
    }
}

}

Instead of appending the new record into the List it is deleting the old record in the ListView I followed this particular link for the Endless listview implementation

http://www.androidbegin.com/tutorial/android-parse-com-listview-load-more-using-onscrolllistener-tutorial/

anand
  • 1,570
  • 2
  • 22
  • 53

2 Answers2

3

This happen because you do not append with the previous list.

your code should look like this

    public class MyTask extends AsyncTask> {

        @Override 
        protected void onPreExecute() { 
            super.onPreExecute(); 
        } 

        @Override 
        protected List<City> doInBackground(String... urls) { 
            try { 
                List<City> city_new = serviceProvider.getService().getCities(); 
    if(city_new  != null && city_new.size() > 0 ){
    city.addAll(city_new  )
    }
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
            return city; 
        } 

        @Override 
        protected void onPostExecute(List<City> organization) { 
            adapter = new CityListAdapter(getActivity(), city); 
            listView.setAdapter(adapter); 
            // Create an OnScrollListener 
            listView.setOnScrollListener(new AbsListView.OnScrollListener() { 

                @Override 
                public void onScrollStateChanged(AbsListView view, 
                                                 int scrollState) { // TODO Auto-generated method stub 
                    int threshold = 1; 
                    int count = listView.getCount(); 

                    if (scrollState == SCROLL_STATE_IDLE) { 
                        if (listView.getLastVisiblePosition() >= count 
                                - threshold) { 
                            // Execute LoadMoreDataTask AsyncTask 
                            new LoadMoreDataTask().execute(); 
                        } 
                    } 
                } 
            }); 
        } 
    } 

    public class LoadMoreDataTask extends AsyncTask<String, Void, List<City>> {
        @Override 
        protected List<City> doInBackground(String... urls) {
            try { 
                // web service request 
                List<City> city_new = = serviceProvider.getService().getNextCities(); 
if(city_new  != null && city_new.size() > 0 ){
city.addAll(city_new  )
}
            } catch (IOException e) {
                e.printStackTrace();
            } 
            return city; 
        } 

        @Override 
        protected void onPostExecute(List<City> organization) {
            int position = listView.getLastVisiblePosition();
            adapter = new CityListAdapter(getActivity(), city); 
            listView.setAdapter(adapter); 
            adapter.notifyDataSetChanged(); 
            listView.setSelectionFromTop(position, 0);
            mProgressDialog.dismiss(); 
        } 
    } 
    }

enter code here

Dhruba Bose
  • 331
  • 1
  • 7
1
  @Override 
        protected void onPostExecute(List<City> organization) {
            int position = listView.getLastVisiblePosition();
             previousCityList.addAll(city);**//add this line**
            adapter = new CityListAdapter(getActivity(), previousCityList); 
            listView.setAdapter(adapter); 
            adapter.notifyDataSetChanged(); 
            listView.setSelectionFromTop(position, 0);
            mProgressDialog.dismiss(); 
        } 
Piyush
  • 1,925
  • 1
  • 18
  • 29