1

중에있는 ScrollView의 스크롤 위치 관리 :I는 다음과 같이 구현된다 책장이 방향 변경

I 갖고 동적으로 생성 TableRows 대한 컨테이너의 역할을 중첩 TableLayout을 포함을있는 ScrollView.

<com.test.bookshelf.CustomScrollView 
     android:id="@+id/scrollview" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/newHeader" 
     android:overScrollMode="never" 
     android:fadingEdge="none" > 

     <TableLayout 
      android:id="@+id/tblLayout" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:padding="0dp" > 
     </TableLayout> 
    </com.test.bookshelf.CustomScrollView> 

있는 ScrollView 지정 번호 :

public class CustomScrollView extends ScrollView { 

    private boolean enableScrolling = true; 
    private ScrollViewListener scrollViewListener = null; 

    public interface OnEndScrollListener { 
     public void onEndScroll(); 
    } 

    private OnEndScrollListener mOnEndScrollListener; 

    public boolean isEnableScrolling() { 
     return enableScrolling; 
    } 

    public void setEnableScrolling(boolean enableScrolling) { 
     this.enableScrolling = enableScrolling; 
    } 

    public CustomScrollView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public CustomScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomScrollView(Context context) { 
     super(context); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 

     if (isEnableScrolling()) { 
      return super.onInterceptTouchEvent(ev); 
     } else { 
      return false; 
     } 
    } 

    public void setScrollViewListener(ScrollViewListener scrollViewListener) { 
     this.scrollViewListener = scrollViewListener; 
    } 

    @Override 
    protected void onScrollChanged(int x, int y, int oldx, int oldy) { 
     super.onScrollChanged(x, y, oldx, oldy); 
     if(scrollViewListener != null) { 
      scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); 
     } 
    } 

    public OnEndScrollListener getOnEndScrollListener() { 
     return mOnEndScrollListener; 
    } 

    public void setOnEndScrollListener(OnEndScrollListener mOnEndScrollListener) { 
     this.mOnEndScrollListener = mOnEndScrollListener; 
    } 
} 

각 테이블 행 동적 서의 총 개수에 기초하여 계산된다 열 고정 된 수의 구성. 방향 변경시이 전체 레이아웃이 다시 만들어집니다.

책꽂이를 생성 할 때 총 행 수가 정적 변수에 저장됩니다.

사용자가 책을 클릭하면 세부 정보 페이지로 이동합니다. 내가 클릭 이벤트 기간 동안 현재의 스크롤 위치를 저장하고 :

public static currentScrollPosition = 0; 

imageviewobj.setOnClickListener(new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     currentScrollPosition = scrollviewObj.getScrollY(); 

....

이 화면에 사용자가 반환 I이 값을 사용하여 스크롤 위치를 복원

.

scrollviewObj.post(new Runnable() { 
     @Override 
     public void run() { 
      scrollviewObj.scrollTo(0, currentScrollPosition); 
     } 
    }); 

하지만 어떻게 방향 변경시 해당 스크롤 위치을 계산합니까? 세로 모드에서 책의 세로 간격 띄우기 (스크롤 위치)는 가로 및 세로 열 수가 다르기 때문에 가로 모드와 다릅니다.

이 문제에 대한 의견이 있으십니까?

답변

2

귀하의 경우에는 보이거나 (클릭 된) 행의 색인을 유지해야하며 onSaveInstanceState/onCreate 덕분에이 정보를 유지하십시오.

그 다음 회전이 발생하면 새 인스턴스 onCreate 안에 스크롤해야 할 수직 오프셋을 계산하십시오.

이 경우 고정되어 있지 않으면 높이를 얻기 위해 목록 트리에 전역 트리 레이아웃 관찰자를 추가해야합니다. 그리고 스크롤을 요청할 수 있습니다.

이 방법을 사용하면 목록에서 색인을 추적하여보기와 독립적으로 작업 할 수 있습니다. 그런 다음 세로에서 가로로 작동하지만 세로에서 가로로 작동합니다.

+0

고마워요! 약간의 코드 스 니펫이 도움이 될 것입니다 – Sourav

+0

"보이는"행의 인덱스를 얻는 방법. ListView에는 getFirstVisiblePosition() 메서드가 있습니다. ScrollView에 비슷한 기능이 있습니까? – Sourav

+0

getScrollY를 사용할 수 있습니다. http://stackoverflow.com/q/3327087/693752 – Snicolas