VerticalGridView AndroidTv focus control
problem:When there is no item below the penultimate line, the focus does not switch when pressing KEYCODE_DPAD_DOWN.
Solve the problem:When there is no item below the penultimate line, when KEYCODE_DPAD_DOWN is pressed, the last item gets focus.
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;
}
}