Scroll to a specific view in scroll view
android, scrollview
Solution
If child that we need to scroll to is not a direct child then above solutions don't work
I have used below solution in my project, sharing it may be helpful to others
/**
* Used to scroll to the given view.
*
* @param scrollViewParent Parent ScrollView
* @param view View to which we need to scroll.
*/
private void scrollToView(final ScrollView scrollViewParent, final View view) {
// Get deepChild Offset
Point childOffset = new Point();
getDeepChildOffset(scrollViewParent, view.getParent(), view, childOffset);
// Scroll to child.
scrollViewParent.smoothScrollTo(0, childOffset.y);
}
/**
* Used to get deep child offset.
* <p/>
* 1. We need to scroll to child in scrollview, but the child may not the direct child to scrollview.
* 2. So to get correct child position to scroll, we need to iterate through all of its parent views till the main parent.
*
* @param mainParent Main Top parent.
* @param parent Parent.
* @param child Child.
* @param accumulatedOffset Accumulated Offset.
*/
private void getDeepChildOffset(final ViewGroup mainParent, final ViewParent parent, final View child, final Point accumulatedOffset) {
ViewGroup parentGroup = (ViewGroup) parent;
accumulatedOffset.x += child.getLeft();
accumulatedOffset.y += child.getTop();
if (parentGroup.equals(mainParent)) {
return;
}
getDeepChildOffset(mainParent, parentGroup.getParent(), parentGroup, accumulatedOffset);
}
Problem
I have added a scrollview and the subchilds inside the scrollview. At some point i need to scroll to a specific view. ``` <scrollview> 1. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 2. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 3. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 4. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 5. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 6. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 7. <linearlayout> <textview></textview> <textview></textview> </linearlayout> <button> </button> </scrollview> ``` The above layout was created dynamically. so i can't have the xml file posted here. Layout creation is completely dynamic. Even the number of child view inside the linearlayout may also vary. So when i click on the button i need to get scrolled to a particular view say here when i click on button i need to scroll to the linear layout 4. I tried with the scrollTo method but it scrolls to the top of the scrollview. Please provide some suggestions.