Listview เลื่อนไปที่ท้ายรายการหลังจากอัพเดตรายการ


292

ฉันต้องการตรวจสอบให้แน่ใจว่ารายการถูกเลื่อนไปจนสุดด้านล่างหลังจากฉันอัปเดต listview โดยใช้ listAdapter เพื่อให้แสดงองค์ประกอบสุดท้ายที่ป้อนในรายการ ฉันจะทำสิ่งนี้ได้อย่างไร

ฉันลองสิ่งนี้ แต่ไม่มีโชค:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

ขอบคุณ


ลองทำสิ่งนี้มันใช้งานได้ ... MessagesListView.setTranscriptMode (ListView.TRANSCRIPT_MODE_NORMAL); messagesListView.setStackFromBottom (จริง);
Superdev

lv.setTranscriptMode (ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL) ให้แน่ใจว่า listView จะถูกเลื่อนลงหลังจากเรียกใช้ adapter.notifyDataSetChanged หากสิ่งนี้ไม่ทำงานให้ลองกำหนดคุณสมบัตินี้เป็น xml ดังที่คุณเห็นในโพสต์ด้านล่าง
tomm

คำตอบ:


418

สมมติว่าคุณรู้เมื่อข้อมูลรายการเปลี่ยนแปลงคุณสามารถบอกให้รายการเลื่อนไปที่ด้านล่างด้วยตนเองโดยการตั้งค่าการเลือกรายการเป็นแถวสุดท้าย สิ่งที่ต้องการ:

private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1);
        }
    });
}

@Bhupendra ที่ไม่จำเป็น คุณสามารถทำได้โดยไม่ต้องใช้เธรดเช่นเดียวกับที่แสดงในคำตอบของ Warting
sagarpatidar

2
@Bhupendra setSelection () อัปเดต UI โดยเรียกโพสต์ (Runnable) ในมุมมองคุณมั่นใจได้ว่ารหัส Runnable นั้นทำงานบนเธรด UI ของ Android โดยทั่วไปแล้วจะทำได้ด้วยวิธีนี้เว้นแต่คุณจะรู้ว่าคุณอยู่ในเธรด UI อยู่แล้วหรือกำลังทำให้มั่นใจด้วยวิธีอื่น
Mason Lee

5
มันก็ดูเหมือนว่าการใช้โพสต์บนอะแดปเตอร์สาเหตุเลื่อนนิเมชั่นชุดใหม่ในขณะที่มั่นใจว่าจะอยู่ในหัวข้อหลักและการใช้ setSelection ทันทีหลังจากที่การตั้งค่าอะแดปเตอร์ไม่ก่อให้เกิดการเคลื่อนไหวเลื่อน
Gianluca พี

1
@SaifHamed แสดงความเห็นโดย Mason Lee ในคำตอบของ Kevin สิ่งนี้ทำให้รายการสั้น ๆ มีช่องว่าง "ว่าง" ที่ด้านบนสุดของมุมมองแทนที่จะเป็นด้านล่างซึ่งน่าจะไม่ใช่พฤติกรรมที่ตั้งใจ
dashhund

16
คุณยังสามารถใช้ myListView.smoothScrollToPosition (myListAdapter.getCount () - 1); สำหรับการเลื่อนที่ราบรื่น
Zar E Ahmer

238

คุณต้องใช้พารามิเตอร์เหล่านี้ในมุมมองรายการของคุณ:

  • เลื่อน lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • ตั้งค่าส่วนหัวของรายการไว้ด้านล่าง lv.setStackFromBottom(true);

คุณยังสามารถตั้งค่าพารามิเตอร์เหล่านี้ใน XML เช่น แบบนี้:

<ListView
   ...
   android:transcriptMode="alwaysScroll"
   android:stackFromBottom="true" />

27
โปรดทราบว่าด้วยวิธีนี้แถว "สแต็กจากด้านล่าง" ของมุมมองจะถูกเพิ่มเข้าไป ซึ่งหมายความว่ารายการสั้น ๆ จะมีช่องว่าง "ว่าง" ที่ด้านบนของมุมมองแทนด้านล่างซึ่งไม่ได้เป็นอย่างที่ต้องการเสมอไป
Mason Lee

2
คำถามด่วน: ฉันจะทำให้การเลื่อนเป็นภาพเคลื่อนไหวได้อย่างไร? สาเหตุปัจจุบันเมื่อฉันแจ้ง DataDataSetChanged () มันกระโดดโดยไม่มีภาพเคลื่อนไหว?!?
เฟรดริก

@Georg คุณปิดใช้งานภาพเคลื่อนไหวในตัวเลือกสำหรับนักพัฒนาบนอุปกรณ์ของคุณหรือไม่?
JonasCz - Reinstate Monica

35

การรวมกันของ TRANSCRIPT_MODE_ALWAYS_SCROLL และ setSelection ทำให้ฉันทำงานได้ดี

ChatAdapter adapter = new ChatAdapter(this);

ListView lv = (ListView) findViewById(R.id.chatList);
lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lv.setAdapter(adapter);

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        lv.setSelection(adapter.getCount() - 1);    
    }
});

29

ฉันประสบความสำเร็จในการใช้สิ่งนี้เพื่อตอบสนองต่อการคลิกปุ่มดังนั้นฉันเดาว่าคุณสามารถใช้มันได้หลังจากอัปเดตเนื้อหาของคุณ:

myListView.smoothScrollToPosition(theListAdapter.getCount() -1);

1
นี่เป็นทางออกที่ดี ง่ายหนึ่งบรรทัด
Josh Larson

12

รับสิ่งนี้ใน ListFragment:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);`

เพิ่มคำตอบนี้เพราะถ้ามีคนค้นหา google สำหรับปัญหาเดียวกันกับ ListFragment เขาเพิ่งพบสิ่งนี้ ..

ความนับถือ


9

การใช้: ตั้งค่าส่วนหัวของรายการไว้ด้านล่าง lv.setStackFromBottom(true);

ใช้งานได้สำหรับฉันและรายการจะถูกเลื่อนไปที่ด้านล่างโดยอัตโนมัติเมื่อมีการเปิดเผยเป็นครั้งแรก รายการนั้นจะเลื่อนตามที่ควรจะTRANSCRIPT_MODE_ALWAYS_SCROLLเป็น


6
โปรดทราบว่าด้วยวิธีนี้แถว "สแต็กจากด้านล่าง" ของมุมมองจะถูกเพิ่มเข้าไป ซึ่งหมายความว่ารายการสั้น ๆ จะมีช่องว่าง "ว่าง" ที่ด้านบนของมุมมองแทนด้านล่าง
Mason Lee

5

ฉันใช้

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

เพื่อเพิ่มรายการที่ด้านล่างและรายการที่เก่ากว่าเลื่อนออกจากด้านบนเช่นทรานสคริปต์การสนทนา


โทรgetListView().smoothScrollToPosition(getListAdapter.getCount() - 1);เข้าสู่ระบบเพื่อเริ่มต้นเพื่อเลื่อนไปที่ด้านล่างในจุดเริ่มต้นของกิจกรรม
palindrom

4

ทางออกที่ง่ายที่สุดคือ:

    listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    listView.setStackFromBottom(true);

3

โหมดการถอดเสียงเป็นสิ่งที่คุณต้องการและใช้งานโดย Google Talk และแอปพลิเคชัน SMS / MMS คุณโทรอย่างถูกต้อง NOTEDatasetChanged () บนอะแดปเตอร์ของคุณเมื่อคุณเพิ่มรายการหรือไม่?


ใช่ฉันเป็น รายการได้รับการปรับปรุงอย่างถูกต้อง แต่จะเริ่มจากด้านบนเสมอ ฉันแค่ต้องการมันเพื่อเพิ่มรายการใหม่และเลื่อนไปยังส่วนท้ายของรายการเสมอ
jramirez

โหมดการถอดเสียงถูกปิดใช้งานจริงโดยแอพ SMS ฉันจำไม่ได้ว่าทำไม
Timmmm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.