เลื่อนไปยังตำแหน่งที่ต้องการใน Android ListView โดยทางโปรแกรม


157

ฉันจะเลื่อนไปที่ตำแหน่งใดตำแหน่งหนึ่งในโปรแกรมได้ListViewอย่างไร

ตัวอย่างเช่นผมมีString[] {A,B,C,D....}และผมจำเป็นต้องตั้งค่ารายการที่มองเห็นด้านบนของListViewที่จะดัชนี 21 String[]ของฉัน



ดูคำตอบของฉันที่นี่, stackoverflow.com/a/29345217/1881527
Melbourne Lopes

คำตอบ:


386

สำหรับการเลื่อนโดยตรง:

getListView().setSelection(21);

สำหรับการเลื่อนที่ราบรื่น:

getListView().smoothScrollToPosition(21);

เยี่ยมนี่คือสิ่งที่ฉันต้องการ!
jiasli

เยี่ยมมากมีประโยชน์มากประหยัดเวลาของฉัน ขอบคุณ
Neha Agarwal

ข้อแตกต่าง: อันแรกพยายามตั้งค่าไว้ตรงกลางของรายการ
Victor Pinto

11
smoothScrollToPositionไม่ทำงานข้อเสนอแนะใด ๆ
SweetWisher ツ

1
@SweetWisher ツพยายามโพสต์ล่าช้าในการดำเนินการเช่น:listView.post(() -> listView.smoothScrollToPosition());
Andy Res

64

สำหรับ SmoothScroll with Scroll Duration:

getListView().smoothScrollToPositionFromTop(position,offset,duration);


ตำแหน่งพารามิเตอร์-> ตำแหน่งที่จะเลื่อนเพื่อ
ชดเชย ----> ระยะทางที่ต้องการเป็นพิกเซลของตำแหน่งจากด้านบนของมุมมองเมื่อการเลื่อนเสร็จสิ้น
ระยะเวลา -> จำนวนมิลลิวินาทีที่จะใช้สำหรับการเลื่อน

หมายเหตุ:จาก API 11

คำตอบของ HandlerExploit คือสิ่งที่ฉันกำลังมองหา แต่มุมมองรายการของฉันค่อนข้างยาวและมีตัวเลื่อนตัวอักษร จากนั้นฉันก็พบว่าฟังก์ชั่นเดียวกันสามารถรับพารามิเตอร์อื่น ๆ ได้ด้วย :)


แก้ไข: (จากข้อเสนอแนะของ AFD)

วิธีวางตำแหน่งตัวเลือกปัจจุบัน:

int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);  

ทำงานได้ดี เพื่อปรับปรุงคำตอบของคุณคุณสามารถคำนวณออฟเซ็ตตามที่อธิบายไว้ในstackoverflow.com/questions/5540223/…
AFD

v.getHeight () คืออะไร
Panache

@Panache v เป็นแถวของ listview
amalBit

ฉันรักคุณ youuuuuu
Joao Ferreira

10

ใส่รหัสของคุณในตัวจัดการดังต่อไปนี้

public void timerDelayRunForScroll(long time) {
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() {           
            public void run() {   
                try {
                    lstView.smoothScrollToPosition(YOUR_POSITION);
                } catch (Exception e) {}
            }
        }, time); 
    }

แล้วเรียกวิธีนี้ว่า

timerDelayRunForScroll(100);

ไชโย !!!


7

ฉันได้ตั้งค่า OnGroup ขยายฟังและแทนที่ onGroup ขยาย () เป็น:

และใช้วิธี setSelectionFromTop () ซึ่งตั้งค่ารายการที่เลือกและวางตำแหน่งพิกเซลการเลือกจากขอบด้านบนของ ListView (หากอยู่ในโหมดสัมผัสรายการจะไม่ถูกเลือก แต่จะยังคงอยู่ในตำแหน่งที่เหมาะสม) (เอกสาร Android)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

            expList.setSelectionFromTop(groupPosition, 0);
            //your other code
        }
    });

ฉันต้องเลื่อนมุมมองอื่นพร้อมกันในขณะที่เลื่อนมุมมอง การใช้ setSelectionFromTop บน listview สำหรับการเลื่อนบล็อกเธรด UI ซึ่งทำให้การเลื่อนของมุมมองอื่นช้าลง คุณสามารถให้คำแนะนำวิธีการทำมันได้หรือไม่?
VijayRaj

7

การListviewเลื่อนจะถูกจัดตำแหน่งให้อยู่ด้านบนเป็นค่าเริ่มต้น แต่ต้องการเลื่อนหากไม่สามารถมองเห็นได้ให้ใช้:

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
            listView1.setSelection(position);

ขอบคุณ @zalak แก้ปัญหาของฉันเลิก
Mitul Bhadeshiya

5

หากมีคนกำลังมองหาฟังก์ชั่นที่คล้ายกันเช่นแอพ Gmail

เลื่อนมุมมอง Listview จะถูกวางตำแหน่งไปด้านบนโดยค่าเริ่มต้น ขอบคุณสำหรับคำใบ้ amalBit เพียงลบออก แค่นั้นแหละ.

 Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            int h1 = mDrawerList.getHeight();
            int h2 = header.getHeight();
            mDrawerList.smoothScrollToPosition(h2-h1);
        }
    }, 1000);

4

การจัดการ listView scrolling โดยใช้ UP / Down using.button

หากมีใครสนใจจัดการรายการดูปุ่มขึ้น / ลงหนึ่งแถว แล้วก็

public View.OnClickListener onChk = new View.OnClickListener() {
             public void onClick(View v) {

                 int index = list.getFirstVisiblePosition();
                 getListView().smoothScrollToPosition(index+1); // For increment. 

}
});

ฉันให้คะแนนคุณเพียงเพราะคุณเป็นคนเดียวที่แสดงวิธีรับตำแหน่งปัจจุบัน แต่คุณควรปรับปรุงตัวอย่าง
Panciz

4

หากคุณต้องการข้ามไปยังตำแหน่งที่ต้องการโดยตรงใน listView เพียงแค่ใช้

listView.setSelection (ตำแหน่ง int);

และถ้าคุณต้องการข้ามไปยังตำแหน่งที่ต้องการอย่างราบรื่นใน listView เพียงแค่ใช้

listView.smoothScrollToPosition (ตำแหน่ง int);


3

นี่คือสิ่งที่ได้ผลสำหรับฉัน การรวมกันของคำตอบโดย amalBit & Melbourne Lopes

public void timerDelayRunForScroll(long time) {
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {           
        public void run() {   
            try {
                  int h1 = mListView.getHeight();
                  int h2 = v.getHeight();

                  mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);  

            } catch (Exception e) {}
        }
    }, time); 
}

แล้วเรียกวิธีการนี้เช่น:

timerDelayRunForScroll(400);

1

รายการ list-view.set ง่าย ๆ (คุณ pos); หรือคุณสามารถบันทึกตำแหน่งของคุณด้วย sharedprefrence และเมื่อคุณเริ่มต้นกิจกรรมก็จะได้รับการกำหนดค่าตามความชอบและการตั้งค่าให้เป็น int


สิ่งที่ฉันต้องการจะทำคือย้ายไปด้านบนสุดของรายการโดยอัตโนมัติโดยไม่มีการเลื่อนภาพเคลื่อนไหว ... มันทำงานได้อย่างสมบูรณ์แบบสำหรับสิ่งนั้น
RH201

1

- หากคุณต้องการให้รายการเลื่อนขึ้นไปยังตำแหน่งเฉพาะ:

myListView.smoothScrollToPosition(i);

หากคุณต้องการรับตำแหน่งของรายการเฉพาะใน myListView:

myListView.getItemAtPosition(i);

- นอกจากนี้myListView.getVerticalScrollbarPosition(i);ยังช่วยคุณได้

โชคดี :)


0

คุณต้องการสองสิ่งในการกำหนดตำแหน่งการเลื่อนของ listView อย่างแม่นยำ:

วิธีรับรายการปัจจุบันเลื่อนดูตำแหน่ง:

int firstVisiblePosition = listView.getFirstVisiblePosition(); 
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.

ในการตั้ง listView scroll position:

listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo.. 
listView.scrollTo(0,-topEdge);

-1

ฉันพบวิธีนี้เพื่อให้เลื่อนขึ้นและลงโดยใช้สองปุ่มที่แตกต่างกัน

ตามที่แนะนำโดย @Nepster ฉันใช้การเลื่อนโดยใช้โปรแกรมโดยใช้ getFirstVisiblePosition () และ getLastVisiblePosition () เพื่อรับตำแหน่งปัจจุบัน

final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list);
    .....

        if (list.size() > 0) {
            ImageButton bnt = (ImageButton) findViewById(R.id.down_action);
            bnt.setVisibility(View.VISIBLE);
            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){
                        lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5);
                    }else{
                        lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount());

                    }
                }
            });
            bnt = (ImageButton) findViewById(R.id.up_action);
            bnt.setVisibility(View.VISIBLE);

            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getFirstVisiblePosition()>0){
                        lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5);
                    }else{
                        lwresult.smoothScrollToPosition(0);
                    }

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