package com.owen.tvrecyclerview.example; import android.content.Context; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.v4.view.ViewCompat; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.util.Log; import android.view.View; /** * Created by owen on 16/8/30. */ public class IRecyclerView extends RecyclerView { private OnItemListener mOnItemListener; private ItemListener mItemListener; private boolean mHasFocus = false; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 110: mHasFocus = true; onFocusChanged(mHasFocus, View.FOCUS_DOWN, null); break; case 111: if(getFocusedChild() == null) { mHasFocus = false; onFocusChanged(mHasFocus, View.FOCUS_DOWN, null); } break; } } }; public IRecyclerView(Context context) { super(context); init(context); } public IRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context); } public IRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } private void init(Context context){ mItemListener = new ItemListener() { /** * 子控件的点击事件 * @param itemView */ @Override public void onClick(View itemView) { if(null != mOnItemListener) { mOnItemListener.onItemClick(IRecyclerView.this, itemView, getChildLayoutPosition(itemView)); } } /** * 子控件的焦点变动事件 * @param itemView * @param hasFocus */ @Override public void onFocusChange(View itemView, boolean hasFocus) { if(hasFocus && !mHasFocus){ mHandler.sendEmptyMessage(110); } else if(!hasFocus && mHasFocus) { mHandler.removeMessages(111); mHandler.sendEmptyMessageDelayed(111, 100); } if(null != mOnItemListener) { if(null != itemView) { itemView.setSelected(hasFocus); if (hasFocus) { mOnItemListener.onItemSelected(IRecyclerView.this, itemView, getChildLayoutPosition(itemView)); } else { mOnItemListener.onItemPreSelected(IRecyclerView.this, itemView, getChildLayoutPosition(itemView)); } } } } }; } @Override public void onChildAttachedToWindow(View child) { if(!ViewCompat.hasOnClickListeners(child)) { child.setOnClickListener(mItemListener); } if(null == child.getOnFocusChangeListener()) { child.setOnFocusChangeListener(mItemListener); } } @Override public boolean hasFocus() { Log.i("IRecyclerView", "hasFocus..."); return super.hasFocus(); } @Override public boolean isInEditMode() { return true; } public void setOnItemListener(OnItemListener onItemListener) { mOnItemListener = onItemListener; } public interface OnItemListener { void onItemPreSelected(IRecyclerView parent, View itemView, int position); void onItemSelected(IRecyclerView parent, View itemView, int position); void onReviseFocusFollow(IRecyclerView parent, View itemView, int position); void onItemClick(IRecyclerView parent, View itemView, int position); } private interface ItemListener extends View.OnClickListener, View.OnFocusChangeListener { } }