ListView setOnScrollListener Görünümün en üstüne dönmeye devam ediyor

0

Soru

Json'dan daha fazla veri yüklemek için setOnScrollListener ile listview'im var, Json'u almak için Asynctask kullanıyorum. ve JSON sayfa başına 10 sayfalandırılır. Sorun şu ki, kaydırma en alta ulaştığında, Etkinlik yeniden başlatıldığı gibi daha fazla veri görüntülendikten (yüklendikten) sonra kaydırma her zaman en üste geri döner.

Peki parşömenin yerinde kalmasını ve en üste dönmemesini nasıl sağlayabilirim ?

Kod

    listView.setOnScrollListener(new AbsListView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
    
                }
    
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                    if (firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0){
                        nextpage = nextpage + 1;
                        new getJSON().execute();
                    }
                }
            });

private class getJSON extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            footer.setVisibility(View.VISIBLE);
            pDialog = new ProgressDialog(PoActivity.this);
            pDialog.setMessage("Please Wait...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            Handler handler = new Handler();

            String po = handler.makeServiceCall(url + "?page=" + nextpage);

            if (po != null){
                try {
                    JSONObject obj = new JSONObject(po);
                    JSONArray objArray = obj.getJSONArray("data");
                    for (int i = 0; i < objArray.length(); i++){
                        JSONObject data = objArray.getJSONObject(i);
                        String employee = data.getString("name");
                        String status = data.getString("status");


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

                        datarow.put("emp", employee);
                        datarow.put("status", status);

                        polist.add(datarow);

                    }
                }catch (final JSONException e){
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "Json parsing error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }else {
                Log.e(TAG,"Couldn't get json from server");
                endpage = 0;
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), "Couldn't get json from server. check logcat", Toast.LENGTH_SHORT).show();
                    }
                });
            }

            pDialog.dismiss();
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            pDialog.dismiss();
            footer.setVisibility(View.GONE);

            listAdapter = new SimpleAdapter(PoActivity.this, polist,
                    R.layout.po_row, new String[]{"emp", "status"},
                    new int[]{R.id.name, R.id.status});

            listView.setAdapter(listAdapter);    
        }
    }
1

En iyi cevabı

0

Hata, Bağdaştırıcıyı yeniden başlatıp ListView için sıfırlamanızdan kaynaklanır. Bağdaştırıcıyı yalnızca bir kez başlatmanız gerekir ve her veri eklediğinizde bağdaştırıcıdaki liste verilerine eklemeniz gerekir. Ardından notifyDataSetChanged()öğesini çağırın

@Override
protected void onPostExecute(Void aVoid) {
   //should be
   listAdapter.add(dataNew);
   listAdapter.notifyDataSetChanged()
}
2021-11-24 05:00:59

çalışıyor, ancak şimdi yalnızca aynı (yinelenen) verileri gösteriyor
PieceofShid

Zaten ' polist'e veri eklerseniz.'doinbackground'a(datarow)' ekleyin, ardından listadapter'ı aramanıza gerek yoktur.ekle (dataNew);
Nhân Khuất Văn

farklı değil, hatta notifydatasetchanged()eklendi
PieceofShid

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................