2014-12-09 6 views
0

У меня есть AsyncTask, который загружает все мои данные на parse.com, тогда у пользователя есть флажок, чтобы выбрать категории, которые он хочет отобразить. Как только я получаю эти варианты (из отдельного класса через интерфейс), я перезагружаю asyncTask, но он все еще перечисляет все (например, если массив вариантов удаляется/перезагружается).Обновить AsyncTask с новыми параметрами

вот мой код, чтобы получить выбранные категории:

@Override 
public void onOkay(ArrayList<Integer> selected) { 
    StringBuilder stringBuilder = new StringBuilder(); 
    if (selected.size() != 0) { 
     for (int i = 0; i < selected.size(); i++) { 
      String categories = selectedArray[selected.get(i)]; 
      stringBuilder = stringBuilder.append(", " + categories); 
     } 
     //this is to display the content of the selectedArray : 
     Toast.makeText(this, "You have selected: " 
     + stringBuilder.toString(), Toast.LENGTH_SHORT).show(); 

     //reloading the AsyncTask class : 
     new RemoteDataTask().execute(); 
    } 
} 

Мой AsyncTask:

private class RemoteDataTask extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     //timer and progressdialog... 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     list_of_articles = new ArrayList<Articles>(); 
     try { 

      // Locate the class table named "Article" in Parse.com 
      ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
        "Article"); 
      query.whereWithinKilometers("Localisation_Vendeur", device_location, rayon); 

      //this is the query I use : 
      query.whereContainedIn ("Category",Arrays.asList(selectedArray)); 
      ob = query.find(); 
      for (ParseObject article : ob) { 
       // Locate images in article_image column 
       ParseFile image = (ParseFile) article.get("label1"); 
       Articles map = new Articles(); 
       map.setArticle_label1((String) article.get("label2")); 
       map.setArticle_label2((String) article.get("label3")); 
       map.setArticle_category((String) article.get("Category")); 
       map.setArticle_label4((String) article.get("label4")); 
       map.setArticle_image(image.getUrl()); 
       list_of_articles.add(map); 
      } 
     } catch (ParseException e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     listview = (ListView) findViewById(R.id.listview); 
     // Pass the results into ListViewAdapter.java 
     adapter = new ListViewAdapter(MainActivity.this, 
       list_of_articles); 
     // Binds the Adapter to the ListView 
     listview.setAdapter(adapter); 
     // Close the progressdialog 
     mProgressDialog.dismiss(); 
    } 
} 

Как я могу сделать эту работу? Имейте в виду, что запрос работает, я тестировал массив, который я заполнил вручную, и он работает. Спасибо.

ответ

0

Вы должны передать категории, которые пользователь хочет отобразить в качестве аргументов AsyncTask через AsyncTask.execute(Params... params). Они будут доступны в методе AsyncTask.doInBackground в качестве параметров этого метода. Используйте их внутри метода doInBackgorund, чтобы задать свой запрос соответствующим образом.

private class RemoteDataTask extends AsyncTask<List<String>, Void, Void> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     //timer and progressdialog... 
    } 

    @Override 
    protected Void doInBackground(List<String>... params) { 
     list_of_articles = new ArrayList<Articles>(); 
     try { 

      // Locate the class table named "Article" in Parse.com 
      ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
        "Article"); 
      query.whereWithinKilometers("Localisation_Vendeur", device_location, rayon); 

      //this is the query I use : 
      query.whereContainedIn ("Category", params[0]); 
      ob = query.find(); 
      for (ParseObject article : ob) { 
       // Locate images in article_image column 
       ParseFile image = (ParseFile) article.get("label1"); 
       Articles map = new Articles(); 
       map.setArticle_label1((String) article.get("label2")); 
       map.setArticle_label2((String) article.get("label3")); 
       map.setArticle_category((String) article.get("Category")); 
       map.setArticle_label4((String) article.get("label4")); 
       map.setArticle_image(image.getUrl()); 
       list_of_articles.add(map); 
      } 
     } catch (ParseException e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     listview = (ListView) findViewById(R.id.listview); 
     // Pass the results into ListViewAdapter.java 
     adapter = new ListViewAdapter(MainActivity.this, 
       list_of_articles); 
     // Binds the Adapter to the ListView 
     listview.setAdapter(adapter); 
     // Close the progressdialog 
     mProgressDialog.dismiss(); 
    } 
} 

Затем в коде запуска AsyncTask по телефону new RemoteDataTask().execute(Arrays.asList(selectedArray)). Удостоверьтесь, что selectedArray обновляется должным образом перед каждым вызовом AsyncTask.

+0

'query.whereContainedIn (" Category ", Arrays.asList (selectedArray));' должен быть 'query.whereContainedIn (" Category ", stringBuilder);'? Я просто думаю. – LeXeR

+0

@LeXeR 'whereContainedIn' запрашивает массив значений. Я использовал stringbuilder для отображения содержимого массива (только для тестирования, он будет удален) – RidRoid

+0

проверить содержимое 'Arrays.asList (selectedArray)'. я думаю, что это проблема. – LeXeR

Смежные вопросы