ListView setOnScrollListener ต่อกลับมาถึงตอนต้นของมุมมอง

0

คำถาม

ฉัน ListView กับ setOnScrollListener ที่จะโหลดมากกข้อมูลจาก LANGUAGE ฉันใช้ Asynctask จะ LANGUAGE. และ LANGUAGE คือ paginated 10 ต่อหน้าก ปัญหาก็คือเมื่อมีการเลื่อนไปถึงท้ายที่สุเลื่อนมันอยู่เสมองกลับไปที่ด้านหลังจากข้อมูลที่แสดงอยู่(โหลด)เหมือนที่กิจกรรมนี้จะเริ่มต้น

ดังนั้นวิธีที่จะทำให้เลื่อนอยู่ในตำแหน่งแล้วไม่ได้กลับมายังคลิปบอร์ด?

รหัส

    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

คำตอบที่ดีที่สุด

0

ข้อผิดพลาดคือสาเหตุมาจากเธอจะ re-กำลังเริ่มการทำงานที่อะแดปเตอร์และ resetting มันสำหรับ ListView. คุณต้องการเริ่มการอะแดปเตอร์เพียงครั้งเดียวและแต่ละครั้งคุณเพิ่มข้อมูลคุณต้องการจะเพิ่มมันไป ListData ในรอะแดปเตอร์. งั้นโทรหา notifyDataSetChanged()

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

มันเป็นงานแต่ตอนนี้แค่แสดงเดียวกัน(ที่ซ้ำกันออก)ข้อมูล
PieceofShid

ถ้าคุณแล้วเพิ่มข้อมูลไปยัง'polist.เพิ่ม(datarow)'ไว้ใน'doInBackground'จากนั้นคุณไม่จำเป็นต้องโทรหา listAdapter.เพิ่ม(dataNew);
Nhân Khuất Văn

มันไม่ต่างกันแม้แต่จะเพิ่ม notifydatasetchanged()
PieceofShid

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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