2013-07-17 52 views
20

Tôi đang cố gắng triển khai danh sách cuộn cuộn bất tận nhưng khi tôi gọi notifyDataSetChanged() toàn bộ danh sách làm mới thì vị trí cuộn sẽ quay lại đầu trang.notifyDataSetChanged() làm cho danh sách làm mới và cuộn nhảy trở lại đầu trang

Đây có phải là hành vi bình thường không? làm thế nào tôi có thể làm cho nó chỉ đơn giản là thêm các mục được thêm vào mà không làm mới và giữ vị trí di chuyển?

+0

bạn có thể đăng toàn bộ mã không? – yfsx

Trả lời

51

này là không bình thường. Nếu không thấy mã của bạn, tôi có thể đề xuất sau:

1) Bạn không gọi số notifyDataSetChanged() từ chuỗi giao diện người dùng. Cách đúng:

runOnUiThread(new Runnable() { 
    public void run() { 
     adapter.notifyDataSetChanged(); 
    } 
}); 

2) Bạn vô tình hoặc không được thực hiện một cuộc gọi đến adapter.notifyDataSetInvalidated();

3) Trong bộ chuyển đổi của bạn, bạn ghi đè lên các phương pháp adapter.notifyDataSetChanged(); và bổ sung hướng dẫn để đi đến đầu

4) Nếu bạn đang sử dụng danh sách để điền vào bộ điều hợp - bạn cung cấp danh sách mới mọi lúc, do đó cài đặt bộ điều hợp được làm mới. Bạn nên luôn luôn cung cấp cùng một danh sách. Tuy nhiên bạn có thể thay đổi nó nhiều như bạn muốn. Nếu bạn đang thiết lập lại danh sách sử dụng list.clear thay vì list = new ArrayList();

Dưới đây là một ví dụ về bộ chuyển đổi của tôi:

public class Adapter extends BaseAdapter { 

    private Activity activity; 
    private ArrayList<HashMap<String, String>> data; 
    private static LayoutInflater inflater = null; 
    public ImageLoader imageLoader; 

    public MediaItemAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
     activity = a; 
     data = d; 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     imageLoader = new ImageLoader(activity.getApplicationContext()); 
    } 

    public int getCount() { 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     if (convertView == null) { 
      vi = inflater.inflate(R.layout.item_composer, null); 
     } 
     TextView title = (TextView) vi.findViewById(R.id.item_title); // title 
     TextView price = (TextView) vi.findViewById(R.id.price); 


     return vi; 
    } 


} 

Gọi cho adapter:

List myList = new ArrayList<HashMap<String, String>>(); 
Adapter ma = new Adapter(this, myList); 

myList thể để trống trước khi bộ chuyển đổi khởi tạo.

Sau đó làm một số hoạt động với danh sách của tôi:

myList.add(someElement); 
ma.notifyDataSetChanged(); 

nếu bạn cần xóa tất cả các mục:

myList.clear(); 
ma.notifyDataSetChanged(); 

thực hiện như vậy là khá bất tận, tôi thấy nhiều hơn thì 15.000 yếu tố mà không cần bất kỳ vấn đề.

+0

Bạn có thể xem http: // stackoverflow không.com/questions/27815882/scroll-position-jumps-to-trước-list-items-while-scrolling-up-in-custom-listvi – kittu88

+0

Trong trường hợp của tôi, đó là vấn đề thứ ba. Tôi đã phổ biến một danh sách hoàn toàn mới và gán nó cho biến ban đầu được sử dụng với bộ điều hợp vì danh sách trong bộ điều hợp không bao giờ được làm mới. – Nashe

+0

Bài đăng tuyệt vời! Đã lưu sự tỉnh táo của tôi! – siniux

6

Bạn có thể làm điều đó theo cách khác, như hành vi như vậy

int position = scrollView.getSelectedItemPosition(); 
notifyDataSetChanged(); 
scrollView.setSelection(position); 
+2

Nó không phải là đúng cách nhưng đôi khi rất hữu ích! – Kasas

2

Nếu bộ điều hợp của bạn đang phân lớp ArrayList thì gọi adapter.clear() sẽ gọi notifyDataSetChanged() khiến vị trí cuộn bị mất. Cân nhắc gọi số setNotifyOnChange(false) trước để ngăn chặn điều này.

biết thêm thông tin ở đây: https://stackoverflow.com/a/14719538/383761

5

Trong trường hợp của tôi vấn đề là tôi đang gọi ListView.setAdapter(adapter) mỗi khi dữ liệu mới được thành lập mà còn thiết lập lại vị trí và quan điểm nhảy lên đầu trang.

Xóa các cuộc gọi thừa setAdapter(...) đã sửa nó cho tôi.

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