2016-11-28 2 views
0

Я делаю приложение, которое имеет прослушиватель прокрутки, который добавляет данные из нескольких URL-адресов , но когда я просматриваю список, переходим в первую позицию и загружаем URL-адрес, который я знаю, что адаптер в моей синхронизации задача получить выполняется каждый раз, когда я загрузить новую задачу URL, когда я загрузить новый элемент, но я не знаю, как это исправитьListview перейти к началу при добавлении нового элемента

public class jsontask extends AsyncTask<String, String, List<newsmodel>> { 


    @Override 
    protected List<newsmodel> doInBackground(String... params) { 
     BufferedReader reader = null; 
     HttpURLConnection connection = null; 
     try { 
      URL url = new URL(params[0]); 

      connection = (HttpURLConnection) url.openConnection(); 
      if (connectiondetector.isConnected()) { 
       connection.addRequestProperty("Cache-Control", "max-age=0"); 
      } else { 
       moviemodelList.addAll((List<newsmodel>) cacheThis.readObject(
         technology.this, fileName)); 

      } 
      connection.connect(); 
      InputStream stream = connection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 
      StringBuffer buffer = new StringBuffer(); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 

      } 


      String finaljson = buffer.toString(); 
      JSONObject parentobject = new JSONObject(finaljson); 


      JSONArray parentarray = parentobject.getJSONArray("articles"); 

      for (int i = 0; i < parentarray.length(); i++) { 
       JSONObject finalobject = parentarray.getJSONObject(i); 
       newsmodel newsmodel = new newsmodel(); 
       newsmodel.setAuthor(finalobject.getString("author")); 
       if (finalobject.isNull("author")) { 

       } 
       newsmodel.setDescription(finalobject.getString("description")); 
       newsmodel.setTitle(finalobject.getString("title")); 
       newsmodel.setImage(finalobject.getString("urlToImage")); 
       newsmodel.setUrl(finalobject.getString("url")); 

       newsmodel.setPublishedAt(finalobject.getString("publishedAt")); 
       cacheThis.writeObject(technology.this, fileName, moviemodelList); 
       moviemodelList.add(newsmodel); 

      } 


      return moviemodelList; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
      return moviemodelList; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return moviemodelList; 
     } catch (JSONException e) { 

     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 


      } 
      try { 
       if (reader != null) { 
        reader.read(); 

       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 


     return moviemodelList; 
    } 


    @Override 
    protected void onPostExecute(List<newsmodel> result) { 


     super.onPostExecute(result); 
     newsadapter adapter = new newsadapter(getApplicationContext(), R.layout.row, result); 
     lvnews.setAdapter(adapter); 
    } 

} 


public class newsadapter extends ArrayAdapter { 
    private List<newsmodel> moviemodelList; 
    private int resource; 
    private LayoutInflater inflater; 

    public newsadapter(Context context, int resource, List<newsmodel> objects) { 
     super(context, resource, objects); 
     moviemodelList = objects; 
     this.resource = resource; 
     inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 


    }` 

и это, как я моя преобразование приложений синхронизации задачи

protected void onStart() { 
    super.onStart(); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    moviemodelList.clear(); 
    new jsontask().execute("https://newsapi.org/v1/articles?source=engadget&sortBy=top&apiKey=ade8f00a634b4825a028837ec107afae"); 
    lvnews.setOnScrollListener(new EndlessScrollListener() { 
     @Override 
     public boolean onLoadMore(int page, int totalItemsCount) { 

      new jsontask().execute("url1"); 
      new jsontask().execute("url2"); 
      new jsontask().execute("url3"); 
      new jsontask().execute("url4"); 
      new jsontask().execute("url5"); 
      new jsontask().execute("url6"); 
      return false; 
     } 
    }); 

} 

ответ

1

Удалить эти строки из onPostExecute

newsadapter adapter = new newsadapter(getApplicationContext(), R.layout.row, result); 
lvnews.setAdapter(adapter); 

Вы устанавливаете адаптер eveytime после выполнения doInBackground. Вам нужно сделать это только один раз. Вы можете сделать это в OnCreate

Основные методы, используемые в андроида классе AsyncTask определены ниже :

doInBackground(): Этот метод содержит код, который должен выполняться в фоновом режиме , В этом методе мы можем отправить результаты несколько раз в поток пользовательского интерфейса методом publishProgress(). Для того, чтобы уведомить о том, что обработка фон был завершен, мы просто должны использовать возвращения заявления

onPreExecute(): Этот метод содержит код, который выполняется до фоновой обработки начинается

onPostExecute() : Этот метод вызывается после завершения метода doInBackground. Результат от doInBackground передается этот метод

onProgressUpdate(): Этот метод получает отчеты о ходе работ от метода doInBackground, который публикуется с помощью метода publishProgress, и этот метод может использовать это обновление прогресса, чтобы обновить поток пользовательского интерфейса

Пожалуйста, обратитесь это link знать, как асинхронный задача

+0

спасибо, что работал, но я должен идти на другой вид деятельности, и чем вернуться к основной деятельности, чтобы сделать его показать новость, как я могу это исправить –

+0

add adapter.notifyItemChanged (moviemodelList.size()); после moviemodelList.add (newsmodel); in doInBackground – Eswar

+0

спасибо, что это сработало –

0

После получение первого ответного ответа на вызов для второго ne w jsontask(). execute ("url2");, тогда вызывается третий, четвертый и т. Д.

Сделайте общий код, чтобы повторно использовать его снова и снова.

попробуйте эту ссылку: http://www.devexchanges.info/2015/03/android-listview-dynamically-load-more.html

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