2013-03-13 27 views
6

Tôi có một ListView có chứa các hàng của ViewPager s. Khi ViewPager bị cuộn khỏi màn hình, tôi muốn lưu vị trí trang của nó. Khi người dùng cuộn đến ViewPager một lần nữa, sau đó tôi muốn khôi phục vị trí trang đã lưu cuối cùng của nó.Dừng ViewPagers bên trong ListView từ đặt lại

Tôi đang cố gắng để thực hiện điều này với đoạn mã sau:

public class MyBaseAdapter extends BaseAdapter { 

    // Row ids that will come from server-side, uniquely identifies each 
    // ViewPager 
    private List<String> mIds = new ArrayList<String>(); 
    private Map<String, Integer> mPagerPositions = new HashMap<String, Integer>(); 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     String id = mIds.get(position); 

     View rootView = convertView; 
     if (rootView == null) { 
      rootView = LayoutInflater.from(parent.getContext()).inflate(
        R.layout.row, null); 
     } 

     ViewPager viewPager = (ViewPager) rootView.findViewById(R.id.pager); 
     Integer pagerPosition = mPagerPositions.get(id); 
     if (pagerPosition != null) { 
      viewPager.setCurrentItem(pagerPosition); 
     } 
     viewPager.setOnPageChangeListener(new MyPageChangeListener(id)); 

     return rootView; 
    } 

    @Override 
    public int getCount() { 
     return mIds.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    private class MyPageChangeListener extends 
      ViewPager.SimpleOnPageChangeListener { 

     private String mId; 

     public MyPageChangeListener(String id) { 
      mId = id; 
     } 

     @Override 
     public void onPageSelected(int position) { 
      mPagerPositions.put(mId, position); 
     } 
    } 
} 

Vị trí trang được lưu trên gọi đầu tiên của setPagerPosition(). Sau đó, khi ViewPager tắt màn hình, onPageSelected() được gọi với vị trí trang đầu tiên đã được lưu - ghi đè bất kỳ lệnh gọi onPageSelected() trước đó xảy ra khi ViewPager vẫn hiển thị.

Cách thích hợp để thực hiện việc này là gì?

+0

Danh sách 'ids' là gì? – Luksprog

+0

Id của hàng trong ListView sẽ đến từ phía máy chủ. – Simian

+0

@Simian, hãy thử gọi 'setOnPageChangeListener' trước khi gọi' setCurrentItem' –

Trả lời

3

Giải pháp là không ghi đè vị trí máy nhắn tin khi ViewPager không hiển thị. Dường như có lỗi trong Android khi onPageSelected được gọi khi ViewPager tắt màn hình khi cuộn qua ListView.

@Override 
public void onPageSelected(int position) { 
    if (viewPager.isShown()) { 
     mTopicPositions.put(mId, position); 
    } 
} 
0

Tôi nghĩ bạn có thể lấy vị trí được hiển thị hiện tại theo indexOfChild(viewPager.getFocusedChild()) và lưu trữ nó trong tùy chọn được chia sẻ và có thể truy xuất vị trí này bất cứ khi nào được yêu cầu. Hy vọng điều này sẽ giúp

+0

Tôi cần truy xuất vị trí khi ViewPager hiển thị lại trong ListView. Tức là, khi người dùng cuộn trở lại ViewPager. Lưu trữ trong SharedPreferences là quá mức cần thiết. Và việc lưu trữ View sẽ đánh bại việc tái chế ListView. – Simian

+0

Không cần lưu trữ Chế độ xem, chỉ cần lưu trữ bài kiểm tra. Nhận một mảng số nguyên đa chiều toàn cục 'intPosition [ListViewPosition] [ViewPagerPosition]'. Lưu trữ các giá trị trong chúng và hiển thị khung nhìn theo giá trị. –

+0

@Simian Bạn đã sử dụng? Bất kỳ kết quả nào? –

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