在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是包含按钮的类。
答案 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并让它运行。然后捅一下。