2011-09-26 31 views
133

Làm cách nào để cuộn theo chương trình đến một vị trí cụ thể trong một ListView?Di chuyển theo chương trình đến một vị trí cụ thể trong Android ListView

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

+0

có thể trùng lặp của [Có thể cuộn ListView vào phần tử con của listrow không?] (Http://stackoverflow.com/câu hỏi/6626988/là-nó-có thể-to-scroll-listview-to-a-listrows-con-phần tử) –

+0

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

Trả lời

353

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

getListView().setSelection(21); 

Đối với một cuộn trơn tru:

getListView().smoothScrollToPosition(21); 
+0

Cool, this chính xác là những gì tôi muốn! – Eliko

+0

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

+0

+1 Cảm ơn người đàn ông! Nó làm việc như một say mê! :) – Sajmon

6

tôi đã thiết OnGroupExpandListener và ghi đè onGroupExpand() như:

và sử dụng phương pháp setSelectionFromTop() mà Đặt mục đã chọn và định vị lựa chọn y pixel từ cạnh trên của ListView. (Nếu trong chế độ cảm ứng, mặt hàng sẽ không được lựa chọn nhưng nó sẽ vẫn được bố trí một cách 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 
     } 
    }); 
+0

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

56

Đối với một SmoothScroll với thời gian Scroll:

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

Tham số
vị trí -> Vị trí để cuộn đến
bù đắp ----> Khoảng cách mong muốn bằng pixel của vị trí từ đầu chế độ xem khi cuộn xong
duration-> Số mili giây để sử dụng cho các cuộn

Lưu ý: Từ API 11.

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


Edit: (Từ AFDs gợi ý)

Để xác định vị trí các lựa chọn hiện tại:

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

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

Hoạt động tốt.Để cải thiện câu trả lời của bạn, khoản bù trừ có thể được tính như được mô tả trên https://stackoverflow.com/questions/5540223/center-a-listview-on-its-current-selection – AFD

+0

@AFD cảm ơn .... – amalBit

+2

Tại sao lại là xuống bình chọn? – amalBit

8

Đặt của bạn mã trong trình 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à t hen gọi phương thức này là,

timerDelayRunForScroll(100); 

CHEERS !!!

3

Xử lý ListView di chuyển sử dụng UP/Xuống using.button

Nếu ai đó quan tâm đến việc xử lý ListView một hàng lên/xuống nút sử dụng. sau đó.

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

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

} 
}); 
+0

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

+1

khái niệm tốt, cảm ơn – Ram

-1

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

Theo đề xuất của @Nepster, tôi thực hiện cuộn theo chương trình bằng cách sử dụng getFirstVisiblePosition() và getLastVisiblePosition() để lấy 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); 
        } 

       } 
      }); 
     } 
3

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

Các cuộn listview sẽ được bố trí để đầ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); 
3

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

listView.setSelection (int position);

và nếu bạn muốn nhảy trơn tru đến vị trí mong muốn trong ListView chỉ cần sử dụng

listView.smoothScrollToPosition (int position);

1

Đây là những gì phù hợp với tôi. Sự kết hợp của câu trả lời bằng 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 pháp này như sau:

timerDelayRunForScroll(400); 
5

Các Listview cuộn sẽ được bố trí đầu trang theo mặc định, nhưng muốn di chuyể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); 
+0

Cảm ơn @zalak Giải quyết vấn đề của tôi, Cung cấp cho bạn –

0

dễ dàng lựa chọn danh sách xem.set (bạn pos); 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 tùy chọn và tập hợp cho rằng int

Các vấn đề liên quan