如何使一个按钮可以在RecyclerView中的项目中聚焦

时间:2016-08-12 13:45:00

标签: android android-recyclerview android-tv

在android tv上,我有一个问题,试图获得一个在recyclerview的行上的按钮的焦点。 我已经将按钮设置为可聚焦但仍未获得焦点。 我在行的视图中添加了一个焦点处理程序,但如果这是造成问题的原因我不是:

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type)
{
    final FriendsListViewItem.ItemType itemType = FriendsListViewItem.ItemType.FromInt(type);

    LinearLayout cellLayout = new LinearLayout(m_context);
    cellLayout.setOrientation(LinearLayout.VERTICAL);
    RecyclerView.LayoutParams cellParams = new  RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT,   RecyclerView.LayoutParams.WRAP_CONTENT);
    cellLayout.setLayoutParams(cellParams);

    // create cell data view
    View cellData = new CellView(m_context);
    LinearLayout.LayoutParams params = new      LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,       LinearLayout.LayoutParams.WRAP_CONTENT);
    cellData.setLayoutParams(params);
    cellData.setFocusable(true);
    cellLayout.addView(cellData);
    cellLayout.setOnFocusChangeaListener(new OnFocusChangeaListener)
    {  
        @Override
        public void onFocusChange(View v, boolean hasFocus)
        {
        if(hasFocus)
        {
            v.setBackgroundColor(ContextCompat.getColor(m_context, R.color.friend_cell_highlight_color));
        }
        else
        {
            v.setBackgroundColor(Color.TRANSPARENT);
        }
    }
    return new ViewHolder(cellLayout);
}

CellView是包含按钮的类。

1 个答案:

答案 0 :(得分:0)

看起来您可能正在从头开始构建列表,但我强烈建议您使用Android团队中的Leanback库(至少对于列表而言)。它们提供了一个很好的例子,其中包括sample app中的视频播放,导航和列表。

具体针对您的问题,这可以通过RowsFragment来解决。 RowsFragment负责连续绘制项目并广播“选择”(或焦点)事件和“点击”事件。您可以看到一个确切的示例here

不是在setOnItemClickedListener(...)上调用RowsFragment,而是使用setOnItemSelectedListener(...),如下所示:

        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
            @Override
            public void onItemSelected(ViewHolder itemViewHolder, Object item,
                                       RowPresenter.ViewHolder rowViewHolder, Row row) {
                // Do what you want to the itemViewHolder or item
            }
        });

另一种方法是继承BaseCardView,然后你可以覆盖setSelected()方法来更新它,但是你应该更新 - 这很可能发生在你的Presenter中。 Leanback中的Presenter基本上替换了您用于RecyclerView的适配器。演示者负责将您的数据模型绑定到列表项。

@Override
final protected BaseCardView onCreateView(Context context) {
    final BaseCardView cardView = new BaseCardView(context, null, R.style.YourCardStyle) {
        @Override
        public void setSelected(boolean selected) {
            updateCardBackgroundColor(this, selected);
            super.setSelected(selected);
        }
    };

    cardView.addView(LayoutInflater.from(context).inflate(R.layout.your_card_layout, null));
    initCardView(cardView);
    return cardView;
}

我强烈建议在Android Studio中打开他们的example app并让它运行。然后捅一下。