2014-07-14 20 views
5

Những gì tôi muốn lưu trữ có thể được giải thích tốt nhất với một hình ảnhGiữ vị trí cuộn scrollview cho nội dung động

enter image description here

Hộp màu xám biểu thị màn hình, hộp màu xanh là thông tin meta, hộp tròn màu trắng được một SearchView và các hộp màu đỏ là các mục được trả lại từ tìm kiếm.

Tôi đã làm việc này cho đến nay, nhưng sự cố xảy ra khi người dùng tìm kiếm thứ gì đó và các mục vượt quá màn hình (1). Sau đó người dùng cuộn xuống, vì vậy thông tin meta nằm ngoài màn hình (2). Người dùng hiện có thể vẫn nhập truy vấn tìm kiếm mới và do đó thay đổi các mục. Tuy nhiên, khi truy vấn mới trả về quá ít mục để lấp đầy phần còn lại của màn hình (3) thì ScrollView sẽ "nhảy" trở lại đầu trang (không phải trong ảnh, không mong muốn). Những gì tôi muốn là một hành vi mà SearchView vẫn đặt (3). Khi ở trạng thái này, người dùng có thể cuộn trở lại đầu trang (4). Nếu cô ấy không cô ấy không thể di chuyển trở lại mặc dù, thay vào đó các chỉ số overscroll sẽ hiển thị.

Có thể thấy hành vi tương tự trong Ứng dụng Google+. Từ màn hình bắt đầu, hãy vào hồ sơ của bạn (chạm vào tên của bạn ở trên cùng). Bạn sẽ thấy ba thanh ghi ("Giới thiệu về tôi", "Bài viết", "Ảnh" *). Tôi có ví dụ không có hình ảnh trong đó và hành vi là như mô tả.

chỉnh sửa ScrollView là gốc của Chế độ xem.

chỉnh sửa bố trí cơ bản cấu trúc

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" 
    android:overScrollMode="always" 
    android:fillViewport="true"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <View /> <!-- Meta info --> 
     <SearchView /> 
     <View /> <!-- Item representing search result --> 
     <View /> <!-- Item representing search result --> 
     <View /> <!-- Item representing search result --> 
     <View /> <!-- Item representing search result --> 
     <View /> <!-- Item representing search result --> 
    </LinearLayout> 
</ScrollView> 

*) Giả dịch từ App Đức.

+0

Vì tôi không quen với cách thực hiện điều này, có lẽ bạn có thể cung cấp một số đoạn trong đó các lớp đang được sử dụng để đạt được hành vi cuộn này mà bạn đang làm việc cho đến nay. Cân nhắc quá trình và cố gắng tìm cách tiếp cận. –

+1

Bạn đã thử sử dụng scrollTo() để di chuyển ScrollView xuống dưới? Không chắc chắn đó là những gì bạn nên sử dụng nhưng nó có thể giúp đỡ. – zgc7009

+0

Nó chỉ là một ScrollView đơn giản xung quanh mọi thứ khác. Không có gì lạ mắt. – Mene

Trả lời

0

Vì dường như không có giải pháp chuẩn trong sdk Android, cũng không phải bất kỳ mã công khai nào làm việc này, tôi đã giải quyết vấn đề của riêng mình. Đây là giải pháp làm việc của tôi:

Tôi đã bọc kết quả tìm kiếm trong LinearLayout và sử dụng minimumHeight để lưu trữ hành vi mong muốn. Bằng cách này tôi không cần phải fiddle với các phép đo khi các mục được thêm vào danh sách.

<LinearLayout 
    android:id="@+id/scroll_placeholder" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    > 
    <View /> <!-- result --> 
    <View /> <!-- result --> 
    <View /> <!-- result --> 
</LinearLayout> 

Kết quả tìm kiếm được truy xuất không đồng bộ nên tôi xóa danh sách và bắt đầu chỉ báo tìm kiếm khi tìm kiếm mới được kích hoạt. Tại thời điểm này tôi cũng thiết lập chiều cao tối thiểu để kích thước của rect trực quan của itemList. Lưu ý rằng itemList không phải là ScrollView vì nếu không sẽ có một ScrollView trong ScrollView có vấn đề. Về cơ bản nó là một LinearLayout chứa các kết quả.

int scrollY = rootScrollView.getScrollY(); 
if (scrollY > 0) { 
    final Rect visibleListViewRect = new Rect(); 
    placeholder.getGlobalVisibleRect(visibleListViewRect); 
    placeholder.setMinimumHeight(visibleListViewRect.height()); 
} else { 
    placeholder.setMinimumHeight(0); 
} 

Điều này sẽ đưa ra hành vi như được thấy trong hình 3) của câu hỏi.

Để vô hiệu hóa di chuyển xuống khi người dùng đã cuộn lên (ảnh 4) Tôi đã thêm một ScrollChangedListener:

placeholder.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { 
    @Override 
    public void onScrollChanged() { 
     int scrollY = placeholder.getScrollY(); 
     if (scrollY > 0) { 
      final Rect visibleListViewRect = new Rect(); 
      placeholder.getGlobalVisibleRect(visibleListViewRect); 
      placeholder.setMinimumHeight(visibleListViewRect.height()); 
     } else { 
      placeholder.setMinimumHeight(0); 
     } 
    } 
}); 

Và đó là nó.

0

vì bạn chưa đề cập đến bất kỳ mã nào. Tôi chỉ có thể giới thiệu cho bạn các giải pháp có thể. Tôi đã gặp phải sự cố tương tự. Vấn đề bạn đang gặp phải là do tập trung vào bố cục con. Giải pháp hiệu quả nhất là kiểm soát tiêu điểm.

Hãy thử sử dụng

ScrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); 

và cũng có khi hộp tìm kiếm của bạn đang được sử dụng, bạn có thể lập trình làm

searchBox.requestFocus() 

cho kiểm soát nhiều hơn bạn cũng có thể thử MotionListener.If bạn cũng có thể thêm mã tôi có thể cụ thể hơn. Và không quên kiểm tra các phương pháp xem cuộn http://developer.android.com/reference/android/widget/ScrollView.html

FYI chơi với trọng tâm sẽ cung cấp cho bạn rất nhiều tình huống thú vị và hình ảnh động/chuyển động quá :)

+0

Tôi đã thêm đường viền bố cục của mình. Nhưng thành thật mà nói, tôi không thể thấy nó có liên quan gì đến trọng tâm. – Mene

+1

Ok .. Điều gì xảy ra nếu bạn thêm một bố cục khác bên dưới linearlayout của bạn (xem danh sách) .. Để lấp đầy phần còn lại của bố cục xem cuộn. – Droidekas

+0

Vâng, đó là giải pháp tôi đang thực hiện ngay bây giờ. Cũng là cách đầu tiên để giải quyết nó đến với tâm trí của tôi, nhưng nó thực sự khá phức tạp nếu bạn giữ hình ảnh 4) trong tâm trí. Tôi đã hy vọng cho một cái gì đó thẳng tiến hơn, đặc biệt là kể từ khi nó được thực hiện trong Google+. – Mene

0

Có lẽ tôi sẽ có thời gian để quay trở lại vấn đề này sau và cập nhật với các chi tiết bổ sung về cách tôi nghĩ rằng tôi sẽ giải quyết vấn đề này. Nhưng bây giờ tôi sẽ chỉ đăng một cái gì đó mà tôi có thời gian cho.

Tôi tin rằng điều này sẽ được thực hiện với một cuộn bên dưới và chỉ một chế độ xem ở trên. Một trong các siêu dữ liệu và searchview và khác trên các yếu tố bạn muốn di chuyển trên trong một danh sách mô phỏng.

Kiểm tra sẽ phải được thực hiện khi bạn cuộn qua danh sách được mô phỏng bên dưới. Giảm kích thước của chế độ xem ở trên theo tác vụ từ scrollview bên dưới dựa trên người nghe trên scrollview; đến giới hạn kích thước của chế độ xem tìm kiếm. Sau đó, khi điều kiện được đáp ứng rằng scrollview dưới đây đã đạt đến kết thúc, mở rộng quan điểm trên để lấp đầy không gian.

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