首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >onResume导致的Android重复列表视图

onResume导致的Android重复列表视图
EN

Stack Overflow用户
提问于 2018-06-06 05:06:28
回答 2查看 168关注 0票数 0

你好,我是android的新手。有一个arrayList和一个ListView。我使用AsyncTask类从MYSQL DB调用数据库。这个AsyncTask类设置mArrayList(这是arrayList)。为了在我从另一个活动返回时更新列表视图,我使用了onResume()。这就是问题的关键。

代码语言:javascript
复制
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mold_breakage_history);

        brokenMoldListView = findViewById(R.id.brokenMoldListView);

        mArrayList = new ArrayList<>();
        GetData task = new GetData();
        task.execute("http://www.cafe24.com/aaa.php");

    }

    @Override
    protected void onResume() {
        super.onResume();

        mArrayList = new ArrayList<>();
        GetData task = new GetData();
        task.execute("http://www.cafe24.com/aaa.php");

在onResume()中,我初始化了mArrayList并再次调用AsyncTask来更新ListView。问题是在第一次执行此活动时,ListView是重复的。但是,当我从本练习的下一页返回时,问题就消失了。我希望在第一次执行活动时不会出现这个问题。请帮帮忙。这是AsyncTask类的代码。

代码语言:javascript
复制
@SuppressLint("StaticFieldLeak")
    private class GetData extends AsyncTask<String, Void, String> {
        ProgressDialog progressDialog;
        String errorString = null;

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

            progressDialog = ProgressDialog.show(MoldBreakageHistoryActivity.this,
                    "Please Wait", null, true, true);
        }


        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            progressDialog.dismiss();
            Log.d(TAG, "response  - " + result);

            mJsonString = result;
            showResult();
        }


        @Override
        protected String doInBackground(String... params) {

            String serverURL = params[0];


            try {

                URL url = new URL(serverURL);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();


                httpURLConnection.setReadTimeout(5000);
                httpURLConnection.setConnectTimeout(5000);
                httpURLConnection.connect();


                int responseStatusCode = httpURLConnection.getResponseCode();
                Log.d(TAG, "response code - " + responseStatusCode);

                InputStream inputStream;
                if (responseStatusCode == HttpURLConnection.HTTP_OK) {
                    inputStream = httpURLConnection.getInputStream();
                } else {
                    inputStream = httpURLConnection.getErrorStream();
                }


                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                StringBuilder sb = new StringBuilder();
                String line;

                while ((line = bufferedReader.readLine()) != null) {
                    sb.append(line);
                }


                bufferedReader.close();


                return sb.toString().trim();


            } catch (Exception e) {

                Log.d(TAG, "InsertData: Error ", e);
                errorString = e.toString();

                return null;
            }

        }
    }


    private void showResult() {
        try {
            JSONObject jsonObject = new JSONObject(mJsonString);
            JSONArray jsonArray = jsonObject.getJSONArray(TAG_JSON);

            for (int i = 0; i < jsonArray.length(); i++) {

                JSONObject item = jsonArray.getJSONObject(i);

                String brokenDate = item.getString(TAG_BROKEN_DATE);
                String moldCode = item.getString(TAG_MOLD_CODE);
                String finalHitting = item.getString(TAG_FINAL_HITTING_TIMES);


                HashMap<String, String> hashMap = new HashMap<>();

                hashMap.put(TAG_BROKEN_DATE, brokenDate);
                hashMap.put(TAG_MOLD_CODE, moldCode);
                hashMap.put(TAG_FINAL_HITTING_TIMES, finalHitting);


                mArrayList.add(hashMap);
            }

            ListAdapter adapter = new SimpleAdapter(
                    MoldBreakageHistoryActivity.this, mArrayList, R.layout.list_item_broken_mold,
                    new String[]{TAG_BROKEN_DATE, TAG_MOLD_CODE, TAG_FINAL_HITTING_TIMES},
                    new int[]{R.id.brokenDateListItem, R.id.brokenMoldListItem, R.id.finalHittingTimesListItem}
            );

            brokenMoldListView.setAdapter(adapter);

        } catch (JSONException e) {

            Log.d(TAG, "showResult : ", e);
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-06 05:07:43

删除此命令:

代码语言:javascript
复制
 mArrayList = new ArrayList<>();
 GetData task = new GetData();
 task.execute("http://www.cafe24.com/aaa.php");

来自onCreateonResumeonCreate之后立即执行,而您的异步任务执行了两次,这就是为什么它在第一个地方被复制的原因。当你点击背面时,只执行了onResume,所以问题就会发生。

票数 3
EN

Stack Overflow用户

发布于 2018-06-06 05:16:19

请删除

代码语言:javascript
复制
 mArrayList = new ArrayList<>();
 GetData task = new GetData();
 task.execute("http://www.cafe24.com/aaa.php");

来自您的onCreate方法。

但是,如果你需要在onCreate中做一些场景,在onResume中做另一个场景,你只能在执行新任务之前使用mArrayList.clear();

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50708931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档