2010-10-10 33 views
15

Có cách nào để lập chỉ mục lại một SectionIndexer sau khi các mục mới được thêm vào một ListView không?Chỉ mục lại/Làm mới một SectionIndexer

Tôi tìm thấy điều này solution, nhưng lớp phủ là vị trí ở góc trên cùng bên trái sau khi SectionIndexer được làm mới.

Bất kỳ ai có ý tưởng nào?

+0

Tôi đang làm một cái gì đó tương tự ĐÂY http://stackoverflow.com/questions/10224233/alphabetindexer-with-custom-adapter-managed-by-loadermanager – toobsco42

Trả lời

4

Khi FastScroller (trong AbsListView lớp ListView kéo dài từ) có được phần của mình bằng cách gọi SectionIndexer#getSections(), nó không bao giờ tái có được chúng trừ khi bạn bật/tắt nhanh chóng cuộn như đề cập trong liên kết mà bạn đề cập. Để có được giá trị được hiển thị trên màn hình, FastScroller gọi phương thức toString của phần.

Một giải pháp tiềm năng là phải có một tùy chỉnh SectionIndexer có các đặc điểm sau:.

  • Mảng phần là có độ dài cố định (chiều dài tối đa của số lượng dự kiến ​​của phần Ví dụ, nếu các phần đại diện cho tiếng Anh bảng chữ cái nó sẽ là 26)
  • Có một đối tượng tùy chỉnh để biểu diễn các phần thay vì sử dụng các chuỗi
  • Ghi đè phương thức toString của đối tượng phần tùy chỉnh để hiển thị những gì bạn muốn dựa trên 'giá trị phần' hiện tại.
  • -

ví dụ: Trong tùy chỉnh của bạn SectionIndexer

private int mLastPosition; 

public int getPositionForSection(int sectionIndex) { 
    if (sectionIndex < 0) sectionIndex = 0; 
    // myCurrentSectionLength is the number of sections you want to have after 
    // re-indexing the items in your ListView 
    // NOTE: myCurrentSectionLength must be less than getSections().length 
    if (sectionIndex >= myCurrentSectionLength) sectionIndex = myCurrentSectionLength - 1; 
    int position = 0; 
    // --- your logic to find the position goes in here 
    // --- e.g. see the AlphabeticIndexer source in Android repo for an example 

    mLastPosition = position; 
    return mLastPosition; 
} 

public Object[] getSections() { 
    // Assume you only have at most 3 section for this example 
    return new MySection[]{new MySection(), new MySection(), new MySection()}; 
} 

// inner class within your CustomSectionIndexer 
public class MySection { 
    MySection() {} 

    public String toString() { 
     // Get the value to displayed based on mLastPosition and the list item within that position 
     return "some value"; 
    } 
} 
1

tôi thấy rằng cách tốt nhất để làm điều này là để gọi setContentView(R.layout.whatever) và sau đó tái cư ListView với adapter/mục dữ liệu mới mới của bạn. Thao tác này sẽ vẽ lại ListView bằng các mục mới của bạn và Lớp phủ FastScroll sẽ xuất hiện ở đúng vị trí.

0

tôi thấy notifyDataSetInvalidated làm việc tốt, đây là ý tưởng: set

public class MyAdapter extends XXXAdapter implements SectionIndexer { 
    ... 
    public void updateDataAndIndex(List data, Map index) { 
     // update sections 
     // update date set 
     notifyDataSetInvalidated(); 
    } 
} 

cập nhật dữ liệu của bạn và chỉ số (phần) bằng cách nào đó, và sau đó notifyDataSetInvalidated, chỉ số sẽ làm mới.

0

Bạn có thể buộc tải lại danh sách phần để ListView bởi listView.setAdapter(yourAdapter)

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