Android Listview notify

1.1k views Asked by At

I have a listview which loads data from server. The data loads properly, but after some time and scrolling the list the application crashes and I get the message "data recieved but adapter is not notified!" The following is my code:

private class LoadData extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void... voids) {
        applicationList = new ArrayList();
        applicationList.clear();
        try {
            JSONArray jsonData = new GetListviewsData().getJSONData(webfileName, limit, offset, priceCat);

            for (int i = 0; i <= jsonData.length() - 2; i++) {
                JSONObject c = jsonData.getJSONObject(i);

                id = c.getString("id");
                name = c.getString("name");
                logo = c.getString("logo");
                developer = c.getString("developer");
                category = c.getInt("category");
                fileName = c.getString("filename");
                path = c.getString("path");
                appSize = c.getDouble("size_bytes");
                price = c.getInt("price");
                data = c.getString("data1").equals("t");
                obb = c.getString("data").equals("t");
                applicationList.add(new ApplicationPojo(id, name, logo, developer, appSize, category, fileName, path, data, obb, price));
            }
            JSONObject sizeObj = jsonData.getJSONObject(jsonData.length() - 1);
            listSize = sizeObj.getInt("size");
        } catch (Exception ex) {
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        if(listSize == 0){
            TextView noResult = (TextView) findViewById(R.id.noresult);
            noResult.setVisibility(View.VISIBLE);
            mProgressDialog.dismiss();

        }else{
            adapter = new ListViewAppAdapter(ListViewAppAll.this, applicationList, listview);
            listview.setAdapter(adapter);
            mProgressDialog.dismiss();

            listview.setOnScrollListener(new AbsListView.OnScrollListener() {

                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
                    int threshold = 1;
                    int count = listview.getCount();

                    if (scrollState == SCROLL_STATE_IDLE) {
                        if (listview.getLastVisiblePosition() >= count - threshold) {
                            if (listSize >= offset) {
                                offset = offset + 15;
                                new LoadMoreData().execute();

                            } else {
                                Toast.makeText(getApplicationContext(), "End of list!", Toast.LENGTH_LONG).show();
                                listview.removeFooterView(footer);
                            }
                        }
                    }
                }

                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                    // TODO Auto-generated method stub
                }
            });
        }
    }
}

private class LoadMoreData extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... voids) {
        try {
            GetListviewsData getDataAppList = new GetListviewsData();

            JSONArray jsonData = getDataAppList.getJSONData(webfileName, limit, offset, priceCat);

            for (int i = 0; i <= jsonData.length(); i++) {
                JSONObject c = jsonData.getJSONObject(i);

                id = c.getString("id");
                name = c.getString("name");
                logo = c.getString("logo");
                developer = c.getString("developer");
                category = c.getInt("category");
                fileName = c.getString("filename");
                path = c.getString("path");
                appSize = c.getDouble("size_bytes");
                price = c.getInt("price");
                data = c.getString("data1").equals("t");
                obb = c.getString("data").equals("t");
                applicationList.add(new ApplicationPojo(id, name, logo, developer, appSize, category, fileName, path, data, obb, price));
            }
        } catch (Exception ex) {

        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        adapter.notifyDataSetChanged();
    }
}

please help me with this. Thanks

1

There are 1 answers

3
Neerajlal K On BEST ANSWER

I made some changes to your code.

Changes,

  • Instead of adding items one my one to the applicationList, add it all at once using addAll and call notifyDataSetChanged. This should remove the error.
  • Initialize the adapter inside oncreate.
  • Use a single AsyncTask instead of two.
  • Use a single AsyncTask doInbackground returns ArrayList instead of void.

See the code below,

// start from 0
int offset = 0;

// create dataset
ArrayList<ApplicationPojo> applicationList = new ArrayList();

// create adapter
ListViewAppAdapter adapter;

onCreate(){
    ...

    TextView noResult = (TextView) findViewById(R.id.noresult);

    adapter = new ListViewAppAdapter(ListViewAppAll.this, applicationList, listview);
    listview.setAdapter(adapter);

    listview.setOnScrollListener(new AbsListView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            int threshold = 1;
            int count = listview.getCount();

            if (scrollState == SCROLL_STATE_IDLE) {
                if (listview.getLastVisiblePosition() >= count - threshold) {
                    if (listSize >= offset) {
                        offset = offset + 15;
                        new LoadData().execute();

                    } else {
                        Toast.makeText(getApplicationContext(), "End of list!", Toast.LENGTH_LONG).show();
                        listview.removeFooterView(footer);
                    }
                }
            }
        }

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

        }
    });
}

private class LoadData extends AsyncTask<Void, Void, ArrayList<ApplicationPojo>> {

    @Override
    protected Void doInBackground(Void... voids) {
        ArrayList<ApplicationPojo> temp = new ArrayList();

        try {
            JSONArray jsonData = new GetListviewsData().getJSONData(webfileName, limit, offset, priceCat);

            for (int i = 0; i < jsonData.length() - 1; i++) {
                JSONObject c = jsonData.getJSONObject(i);

                id = c.getString("id");
                name = c.getString("name");
                logo = c.getString("logo");
                developer = c.getString("developer");
                category = c.getInt("category");
                fileName = c.getString("filename");
                path = c.getString("path");
                appSize = c.getDouble("size_bytes");
                price = c.getInt("price");
                data = c.getString("data1").equals("t");
                obb = c.getString("data").equals("t");
                temp.add(new ApplicationPojo(id, name, logo, developer, appSize, category, fileName, path, data, obb, price));
            }
            JSONObject sizeObj = jsonData.getJSONObject(jsonData.length() - 1);
            listSize = sizeObj.getInt("size");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return temp;
    }

    @Override
    protected void onPostExecute(ArrayList<ApplicationPojo> list) {
        if(listSize == 0) {
            noResult.setVisibility(View.VISIBLE);
        } else {
            applicationList.addAll(list);
            applicationList.notifyDataSetChanged();
        }
        mProgressDialog.dismiss();
    }
}