2

私の Android TV アプリでは、ActionsRow のアクション ボタンがフォーカスを失います。

adapter.notifyArrayItemRangeChanged(0, 1);

電話。私は使っている:

View focusedView = getActivity().getCurrentFocus();

フォーカスされたビューを取得しますが、 notifyArrayItemRangeChangedの後にフォーカスを戻すことはできません。notifyArrayItemRangeChangedの前にフォーカスのあるボタンがフォーカスを失いActionPresenterのonBindViewHolderまたはActionsRowPresenteronBindRowViewHolder内 (または後) でそのボタンを requestFocus にすることはできませ

フォーカスを保持する方法、または元のビューに戻す方法はありますか?

アクションプレゼンター:

@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
    Log.i(TAG, "onBindViewHolder called, item:" + item.toString());
    Action action = (Action) item;
    ActionViewHolder vh = (ActionViewHolder) viewHolder;
    vh.mAction = action;
    vh.mButton.setText(action.getLabel1());
    vh.mButton.setTag(action.getId());

    vh.mButton.requestFocus();
}

ActionsRowPresenter:

protected void onBindRowViewHolder(ActionsRowPresenter.ViewHolder holder, Object item) {
    super.onBindRowViewHolder(holder, item);
    Log.i(TAG, "onBindRowViewHolder called");

    ViewHolder vh = holder;
    ActionsRow row = (ActionsRow) vh.getRow();

    ArrayObjectAdapter aoa = new ArrayObjectAdapter(mActionPresenter);
    aoa.addAll(0, (Collection)row.getActions());
    vh.bind(aoa);
}

NowPlayingChannelRowPresenter:

public NowPlayingChannelRowPresenter(Channel c) {
    setHeaderPresenter(null);
    setSelectEffectEnabled(false);

    mSelectedChannel = c;

    npcdrPresenter = new NowPlayingChannelDetailsRowPresenter(new DetailsDescriptionPresenter());
    actionsRowPresenter = new ActionsRowPresenter();

    ClassPresenterSelector ps = new ClassPresenterSelector();

    ps.addClassPresenter(NowPlayingChannelDetailsRow.class, npcdrPresenter);
    ps.addClassPresenter(ActionsRow.class, actionsRowPresenter);

    npcdRow = new NowPlayingChannelDetailsRow(mSelectedChannel);

    actionsRow = new ActionsRow(mSelectedChannel);

    actionsRow.addAction(new Action(ACTION_START_STOP, "Stop"));
    actionsRow.addAction(new Action(ACTION_ADD_REMOVE_FAVORITE, "Add to Favorites"));

}


@Override
protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.now_playing_channel_row, parent, false);
    ViewHolder vh = new ViewHolder(v);

    vh.mNpcdVh = (NowPlayingChannelDetailsRowPresenter.ViewHolder) npcdrPresenter.onCreateViewHolder(vh.llNpcd);
    vh.llNpcd.addView(vh.mNpcdVh.view);

    vh.mActionsVh = (ActionsRowPresenter.ViewHolder) actionsRowPresenter.onCreateViewHolder(vh.llActions);
    vh.llActions.addView(vh.mActionsVh.view);

    return vh;
}


@Override
protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) {
    super.onBindRowViewHolder(holder, item);

    ViewHolder vh = (ViewHolder) holder;
    npcdrPresenter.onBindRowViewHolder(vh.mNpcdVh, npcdRow);
    actionsRowPresenter.onBindRowViewHolder(vh.mActionsVh, actionsRow);

}

編集 1: ListView はありません。カスタム プレゼンターで ArrayObjectAdapter インスタンスを使用しています。

編集 2:レイアウト ビュー (階層ビュー) を添付しました。

ここに画像の説明を入力

4

2 に答える 2

1

listview拡張する場合はActivity、次を試してください:

listviewName.setSelection(positionOfItem);

listview拡張する場合はListActivity、次を試してください:

getListView().setSelection(positionOfItem);

listView が更新された後でも、特定の位置にフォーカスされます。

于 2015-03-13T13:42:22.723 に答える
0

これは、フォーカスする必要があるアイテムに対してのみ呼び出される必要があります

vh.mButton.requestFocus();

ActionPresenter の最初のアイテムについてのみアダプターに通知すると、最初のアイテムについてのみ onBindViewHolder が呼び出され、フォーカスが取得されます。

フォーカスする必要があるのが 2 番目のアイテムである場合、そのアイテムに対して ActionPresenter の onBindViewHolder を呼び出す必要があり、すべてのアイテムではなく 2 番目のアイテムに対してのみフォーカスをリクエストする必要があります。

于 2015-03-22T09:51:58.943 に答える