verticalGridView AndroidTv フォーカス コントロールの
問題:最後から 2 番目の行より下に項目がない場合、KEYCODE_DPAD_DOWN を押してもフォーカスは切り替わりません。
問題を解く:最後から 2 番目の行の下に項目がない場合、KEYCODE_DPAD_DOWN を押すと、最後の項目がフォーカスを取得します。
public class CustomVerticalGridView extends VerticalGridView {
private int columns;
private int itemCount;
private View lastItem;
/**
* 倒数第二行下方没有item的时候,按KEYCODE_DPAD_DOWN时,最后一个item获取焦点
*/
private OnChildViewHolderSelectedListener mListener = new OnChildViewHolderSelectedListener() {
@Override
public void onChildViewHolderSelected(RecyclerView parent, ViewHolder child, int position, int subposition) {
super.onChildViewHolderSelected(parent, child, position, subposition);
itemCount = getAdapter().getItemCount();
// Log.d("CustomVerticalGridView", "position=" + position);
// Log.d("CustomVerticalGridView", "itemCount=" + itemCount);
if (position + columns >= itemCount && (position % columns) + 1 > itemCount % columns) {
child.itemView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN && event.getAction() == KeyEvent.ACTION_DOWN) {
lastItem = getLayoutManager().findViewByPosition(itemCount - 1);
// Log.d("CustomVerticalGridView", "lastItem=" + lastItem);
if (lastItem != null) {
lastItem.requestFocus();
}
}
return false;
}
});
}
}
};
public CustomVerticalGridView(Context context) {
super(context);
setOnChildViewHolderSelectedListener(mListener);
}
public CustomVerticalGridView(Context context, AttributeSet attrs) {
super(context, attrs);
setOnChildViewHolderSelectedListener(mListener);
}
public CustomVerticalGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setOnChildViewHolderSelectedListener(mListener);
}
@Override
public void setNumColumns(int numColumns) {
super.setNumColumns(numColumns);
columns = numColumns;
}
}