项目中要实现mfc功能,然后子控件焦点下移,LIstView和Gridview父控件不会下移,所以就有这个文章。废话不多说直接上代码。
MFCGridView.java
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewParent;
import android.view.ViewTreeObserver;
import android.widget.GridView;
import com.baidu.navisdk.ui.util.MFCUtil;
public class MFCGridView extends GridView {
protected int lastPosition = -1;
protected boolean mHasRegister = false;
private final ViewTreeObserver.OnGlobalFocusChangeListener mFocusChangeListener =
new ViewTreeObserver.OnGlobalFocusChangeListener() {
@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {
if (!isInTouchMode()) {
refreshListViewScroll(oldFocus, newFocus);
}
}
};
protected void refreshListViewScroll(View oldFocus, View newFocus) {
if (getVisibility() != VISIBLE) {
return;
}
if (newFocus == null) {
return;
}
ViewParent convertView = getConvertView(newFocus);
if (convertView == null) {
return;
}
if (!(convertView instanceof View)) {
return;
}
Object tagView = ((View) convertView).getTag();
if (!(tagView instanceof IMFCHolder)) {
if (lastPosition
!= getAdapter().getCount() - 1) {
smoothScrollToPositionFromTop(0, 0);
lastPosition = -1;
}
return;
}
int focusedPosition = -1;
View focusedChild = getFocusedChild();
if (focusedChild != null) {
focusedPosition = getPositionForView(focusedChild);
}
if (focusedPosition != lastPosition) {
smoothScrollToPositionFromTop(focusedPosition, 50);
lastPosition = focusedPosition;
}
}
protected ViewParent getConvertView(View newFocus) {
ViewParent lastView = null;
ViewParent parent = newFocus.getParent();
if (parent == this){
return (ViewParent) newFocus;
}
while (parent !&