Lập trình cuộn đến một vị trí cụ thể trong ListView của Android


157

Làm thế nào tôi có thể lập trình cuộn đến một vị trí cụ thể trong một ListView ?

Ví dụ: tôi có một String[] {A,B,C,D....}và tôi cần đặt mục hiển thị trên cùng của ListViewchỉ mục 21 của tôi String[].



xem câu trả lời của tôi ở đây, stackoverflow.com/a/29345217/1881527
Melbourne Lopes

Câu trả lời:


386

Đối với một cuộn trực tiếp:

getListView().setSelection(21);

Để cuộn mượt:

getListView().smoothScrollToPosition(21);

Thật tuyệt, đây chính xác là những gì tôi muốn!
jiasli

Tuyệt vời, Rất hữu ích. Tôi tiết kiệm thời gian của tôi. Cảm ơn.
Neha Agarwal

Một điểm khác biệt: cái đầu tiên cố gắng đặt ở giữa danh sách.
Victor Pinto

11
smoothScrollToPositionkhông hoạt động, có đề nghị nào không?
SweetWisher 13/07/2015

1
@SweetWisher cố gắng trì hoãn việc thực thi, đại loại như:listView.post(() -> listView.smoothScrollToPosition());
Andy Res

64

Đối với SmoothScroll với thời lượng Cuộn:

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


Vị trí tham số -> Vị trí để cuộn để
bù ----> Khoảng cách mong muốn tính bằng pixel của vị trí từ đỉnh của chế độ xem khi cuộn kết thúc
thời lượng-> Số mili giây để sử dụng cho cuộn

Lưu ý: Từ API 11.

Câu trả lời của HandlerExploit là những gì tôi đang tìm kiếm, nhưng listview của tôi khá dài và cũng có bộ lọc bảng chữ cái. Sau đó, tôi thấy rằng chức năng tương tự cũng có thể có các tham số khác :)


Chỉnh sửa: (Từ đề xuất của AFD)

Để định vị lựa chọn hiện tại:

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

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

Hoạt động tốt. Để cải thiện câu trả lời của bạn, phần bù có thể được tính như mô tả trên stackoverflow.com/questions/5540223/ mẹo
AFD

v.getHeight () là gì?
Panache

@Panache v là hàng của listview
amalBit

tôi yêu bạnuuuuu
Joao Ferreira

10

Đặt mã của bạn trong xử lý như sau,

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

và sau đó gọi phương thức này như,

timerDelayRunForScroll(100);

GIÁ RẺ !!!


7

Tôi đã đặt OngroupExpandListener và ghi đè ongroupExpand () là:

và sử dụng phương thức setSelectionFromTop () để đặt mục đã chọn và định vị các pixel y được chọn từ cạnh trên của ListView. (Nếu ở chế độ cảm ứng, vật phẩm sẽ không được chọn nhưng nó vẫn sẽ được định vị thích hợp.) (Tài liệu android)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

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

Tôi cần phải cuộn một chế độ xem khác đồng thời trong khi cuộn lisview. Sử dụng setSelectionFromTop trên listview để cuộn chặn luồng UI khiến cho việc cuộn của chế độ xem khác chậm. Bạn có thể cho một số gợi ý làm thế nào để làm điều đó?
VijayRaj

7

Các Listviewcuộn sẽ được bố trí để đầu theo mặc định, nhưng muốn cuộn nếu không nhìn thấy được sau đó sử dụng này:

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

Cảm ơn @zalak Giải quyết vấn đề của tôi, Hãy cho bạn lên
Mitul Bhadeshiya

5

Nếu ai đó đang tìm kiếm một chức năng tương tự như ứng dụng Gmail,

Cuộn Listview sẽ được định vị lên đầu theo mặc định. Cảm ơn đã gợi ý. amalBit. Chỉ cần trừ nó. Đó là nó.

 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

Xử lý danh sách Xem cuộn bằng cách sử dụng LÊN / Xuống bằng cách sử dụng.

Nếu ai đó quan tâm đến việc xử lý danh sách Xem một hàng lên / xuống bằng nút. sau đó.

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

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

}
});

Tôi cho bạn phiếu bầu chỉ vì bạn là người duy nhất chỉ ra cách để có được vị trí hiện tại, nhưng bạn nên cải thiện ví dụ.
Panciz

4

Nếu bạn muốn nhảy trực tiếp đến vị trí mong muốn trong danh sách, chỉ cần sử dụng

listView.setSelection (vị trí int);

và nếu bạn muốn chuyển trơn tru đến vị trí mong muốn trong listView, chỉ cần sử dụng

listView.smoothScrollToP vị trí (vị trí int);


3

Đây là những gì làm việc cho tôi. Kết hợp các câu trả lời của 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); 
}

và sau đó gọi phương thức này như:

timerDelayRunForScroll(400);

1

lựa chọn list-view.set dễ dàng của nó (bạn đặt ra); hoặc bạn có thể lưu vị trí của mình với sharedprefrenceand khi bạn bắt đầu hoạt động, nó nhận được các ưu tiên và thiết lập cho int đó


tất cả những gì tôi muốn làm là tự động di chuyển lên đầu danh sách, mà không có bất kỳ hoạt hình cuộn nào ... điều này hoạt động hoàn hảo cho điều đó
RH201

1

-Nếu bạn chỉ muốn danh sách cuộn lên \ bình minh đến một vị trí cụ thể:

myListView.smoothScrollToPosition(i);

-Nếu bạn muốn có được vị trí của một mục cụ thể trong myListView:

myListView.getItemAtPosition(i);

-cũng điều này myListView.getVerticalScrollbarPosition(i);có thể giúp bạn.

Chúc may mắn :)


0

Bạn cần hai điều để xác định chính xác vị trí cuộn của listView:

Để có được danh sách hiện tại Xem vị trí cuộn:

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

Để đặt vị trí listView Scroll:

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

-1

Tôi tìm thấy giải pháp này để cho phép cuộn lên xuống bằng hai nút khác nhau.

Theo đề xuất của @Nepster, tôi triển khai cuộn theo chương trình bằng cách sử dụng getFirstVisiblePocation () và getLastVisiblePocation () để có được vị trí hiện tại.

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

                }
            });
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.