簡體   English   中英

添加新項目時Listview跳到頂部

[英]Listview jump to top when adding new item

我正在制作具有從多個URL添加數據的滾動偵聽器的應用程序,但是當我滾動列表時,跳轉到第一個位置,而不是加載URL,我知道每次我加載新URL任務時,同步任務中的適配器都會執行加載新項目,但我不知道如何解決

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

}

從onPostExecute刪除這些行

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

在執行doInBackground之后,您將設置適配器eveytime。 您只需要執行一次。 您可以在onCreate中完成

android AsyncTask類中使用的基本方法定義如下

doInBackground():此方法包含需要在后台執行的代碼。 在此方法中,我們可以通過publishProgress()方法將結果多次發送到UI線程。 要通知后台處理已完成,我們只需要使用return語句

onPreExecute():此方法包含在后台處理開始之前執行的代碼

onPostExecute():在doInBackground方法完成處理后調用此方法。 doInBackground的結果傳遞給此方法

onProgressUpdate():此方法從doInBackground方法接收進度更新,該方法通過publishProgress方法發布,並且該方法可以使用此進度更新來更新UI線程

請參考此鏈接以了解異步任務

在獲得第一個URL響應之后,調用第二個新的jsontask()。execute(“ url2”); 然后要求第三,第四,依此類推。

編寫通用代碼以一次又一次地重用它。

試試這個鏈接: http : //www.devexchanges.info/2015/03/android-listview-dynamically-load-more.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM