我的 Listview 使用 D-pad 工作,可以在列表项内切换焦点。这就是我解决它的方法。首先,让您的列表视图具有项目焦点。
注意:如果您稍后在代码中尝试将 ItemsCanFocus 设置为 false,您会发现即使您再次设置回 true,您的列表项也无法再获得焦点,所以不要这样做。
mDpadListView.setItemsCanFocus(true);
然后,您需要一个字段来跟踪当前选择的列表项。这里我把ViewHolder放在Adapter中listItem的标签中。
mDpadListView.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
if (view.getTag() != null) {
DpadListAdapter.ViewHolder holder = (ViewHolder) view.getTag();
if (holder.shortCut != null && holder.shortCut.isShown()) {
currentSelectView = view;
} else {
currentSelectView = null;
}
} else {
currentSelectView = null;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
第三,在Activity Method中重写onKeyDown()来控制D-pad的上、下、左、右键。
当用户在 D-pad 上按下右键时,我让列表视图 clearFoucs() 并让里面的 ImageView 获得焦点。
当用户按下向上、向下或向左时,列表项中的 ImageView 将清除其焦点,列表视图会再次获得焦点。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_RIGHT:
if (currentSelectView != null) {
DpadListAdapter.ViewHolder holder =
(ViewHolder) currentSelectView.getTag();
mDpadListView.clearFocus();
holder.shortCut.setFocusable(true);
holder.shortCut.requestFocus();
return true;
}
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
if (currentSelectView != null) {
DpadListAdapter.ViewHolder holder =
(ViewHolder) currentSelectView.getTag();
if (holder.shortCut.hasFocus()) {
holder.shortCut.clearFocus();
holder.shortCut.setFocusable(false);
mDpadView.requestFocus();
return true;
}
}
break;
default:
break;
}
return super.onKeyDown(keyCode, event);
}