2016-11-28 110 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); 


    }` 

,这是我怎么EXCUTE我的一个同步任务

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

您正在执行doInBackground后设置适配器eveytime删除这些行。你只需要做一次。可以做到这一点在的onCreate

在一个机器人的AsyncTask类中所用的基本方法定义如下

doInBackground():此方法包含需要在后台执行的代码。在这个方法中,我们可以通过publishProgress()方法向UI线程发送多次 次结果。以通知 后台处理已经完成,我们只需要使用 return语句

onPreExecute():此方法包含前的后台处理开始

onPostExecute被执行的代码() :在doInBackground方法完成处理后调用此方法。从doInBackground结果传递给 此方法

onProgressUpdate():这个方法接收从doInBackground方法,其经由publishProgress方法, 出版进度更新,并且此方法可以使用这个进度更新来更新UI线程

请参阅本link知道

+0

如何异步任务谢谢它的工作,但我必须去另一个活动,比回去的主要活动,使之出现的消息如何解决这个 –

+0

add adapter.notifyItemChanged(moviemodelList.size());在moviemodelList.add(newsmodel)之后;在doInBackground – Eswar

+0

谢谢它的工作 –

相关问题