You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于RecyclerView Adapter获焦项触发Fragment内容变更?

实现RecyclerView条目焦点变更触发Fragment内容更新的方案

方法一:在Adapter的ViewHolder中设置焦点监听

RecyclerView没有直接提供setOnItemFocusListener,但可以给每个条目的itemView单独设置焦点变化监听,再通过接口回调把事件传递给Fragment。

  1. 定义焦点回调接口
    在Adapter内部定义接口,用于传递获焦条目的数据:
public interface OnItemFocusChangeListener {
    void onItemFocused(DataModel item); // DataModel替换为你的数据实体类
}
  1. 在Adapter中绑定监听并传递事件
    在Adapter中持有接口实例,然后在ViewHolder的itemView上设置焦点监听:
public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> {
    private List<DataModel> mDataList;
    private OnItemFocusChangeListener mFocusListener;

    // 构造方法、onCreateViewHolder、onBindViewHolder等基础实现...

    public void setOnItemFocusChangeListener(OnItemFocusChangeListener listener) {
        mFocusListener = listener;
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        // ViewHolder内控件定义...

        public ViewHolder(View itemView) {
            super(itemView);
            // 初始化控件...

            // 设置焦点变化监听
            itemView.setOnFocusChangeListener((v, hasFocus) -> {
                if (hasFocus) {
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        DataModel currentItem = mDataList.get(position);
                        if (mFocusListener != null) {
                            mFocusListener.onItemFocused(currentItem);
                        }
                    }
                }
            });
        }
    }
}
  1. 在Fragment中实现接口并更新TextView
    初始化Adapter后,设置焦点回调,拿到获焦条目数据后更新TextView:
// Fragment内代码
YourAdapter adapter = new YourAdapter(dataList);
adapter.setOnItemFocusChangeListener(item -> {
    // 根据数据更新Fragment中的TextView
    yourTargetTextView.setText(item.getDisplayContent()); // 替换为你的数据字段
});
recyclerView.setAdapter(adapter);

方法二:通过RecyclerView的子View附加状态监听统一处理

给RecyclerView设置OnChildAttachStateChangeListener,在子View附加到窗口时统一设置焦点监听,适合需要全局管理的场景:

recyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
    @Override
    public void onChildViewAttachedToWindow(View view) {
        view.setOnFocusChangeListener((v, hasFocus) -> {
            if (hasFocus) {
                RecyclerView.ViewHolder holder = recyclerView.getChildViewHolder(v);
                int position = holder.getAdapterPosition();
                if (position != RecyclerView.NO_POSITION) {
                    DataModel item = dataList.get(position);
                    yourTargetTextView.setText(item.getDisplayContent());
                }
            }
        });
    }

    @Override
    public void onChildViewDetachedFromWindow(View view) {
        // 移除监听避免内存泄漏
        view.setOnFocusChangeListener(null);
    }
});

关键注意事项

  • 确保条目布局的根View可获取焦点:在item布局的根节点添加android:focusable="true"(Fire TV场景下无需设置focusableInTouchMode)。
  • 处理getAdapterPosition()可能返回RecyclerView.NO_POSITION的情况,避免数组越界。
  • 焦点监听内尽量只做轻量UI操作,避免影响页面流畅度。

内容的提问来源于stack exchange,提问作者MyAcct

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:13:18