Android Listview通知

时间:2016-12-31 11:58:22

标签: android listview adapter notify

我有一个listview,可以从服务器加载数据。数据加载正确,但一段时间后滚动列表,应用程序崩溃,我收到消息“收到数据,但没有通知适配器!”以下是我的代码:

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();
    }
}

请帮我解决这个问题。感谢

1 个答案:

答案 0 :(得分:1)

我对您的代码进行了一些更改。

变化,

  • 不是将{1}}中的项目添加到applicationList,而是使用addAll一次添加所有内容,然后致电notifyDataSetChanged。这应该删除错误。
  • 在oncreate内初始化adapter
  • 使用一个AsyncTask代替两个。
  • 使用一个AsyncTask doInbackground返回ArrayList代替void

请参阅下面的代码,

// 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();
    }
}