原创首发
Android TV开发03学习HorizontalGridView
背景
tv中经常用到列表,横向垂直的都很频繁,甚至比手机开发频繁多了,绝大部分都是列表来的,剩下的就是视频播放了。 今天我们学习水平方向的列表组件HorizontalGridView
,加强版的rv。他是属于leanback
库中的一个组件。
先看看效果吧。
具体实现
这个就是rv嘛,那么他也是需要类似于adapter
这样的东西,创建UI
和绑定数据
。但是名字和adapter不一样。
Presenter
androidx.leanback.widget.Presenter
这个就是横向UI的实现类。
public class HorizontalPresenter extends Presenter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
View inflate = LayoutInflater.from(parent.getContext()).
inflate(R.layout.item_hor_layout, parent, false);
return new HorHolder(inflate);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, Object item) {
HorHolder holder = (HorHolder) viewHolder;
if (item instanceof String) {
holder.mTextView.setText((String) item);
}
}
@Override
public void onUnbindViewHolder(ViewHolder viewHolder) {
}
public static class HorHolder extends ViewHolder {
private TextView mTextView;
public HorHolder(View view) {
super(view);
mTextView = view.findViewById(R.id.tv_title);
mTextView.setFocusableInTouchMode(true);
}
}
}
xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:padding="10dp"
android:background="#ffffff"
android:layout_height="wrap_content">
<TextView
android:text="hh"
android:textSize="30sp"
android:textColor="#ffffff"
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/btn_selector" />
</RelativeLayout>
经常写Rv的应该明白这是在干嘛,就是平时写了千百次的绑定数据。
来到主页:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="水平布局" />
<androidx.leanback.widget.HorizontalGridView
android:id="@+id/hgv"
app:focusOutEnd="true"
app:focusOutFront="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="30dp" />
</RelativeLayout>
定义一个在布局中,然后我们开始写适配器和数据就行了。
public class HorizontalActivity extends FragmentActivity {
private ActivityHorizontalBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = ActivityHorizontalBinding.inflate(getLayoutInflater());
setContentView(mBinding.getRoot());
HorizontalGridView hgv = mBinding.hgv;
//水平间距
hgv.setHorizontalSpacing(20);
hgv.setOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
@Override
public void onChildViewHolderSelected(RecyclerView parent, RecyclerView.ViewHolder child, int position, int subposition) {
super.onChildViewHolderSelected(parent, child, position, subposition);
Log.i("->tv", "选中:" + position);
}
});
HorizontalPresenter presenter = new HorizontalPresenter();
//负责数据存储
ArrayObjectAdapter aoa = new ArrayObjectAdapter(presenter);
//负责调用p层的UI创建和数据绑定,就是分发数据的,可以分发多type,这种横向就一个type。
ItemBridgeAdapter iba = new ItemBridgeAdapter(aoa);
aoa.add("动漫");
aoa.add("动`漫");
aoa.add("动2漫");
aoa.add("动3漫");
aoa.add("动5漫");
aoa.add("动漫4");
aoa.add("动漫5");
aoa.add("动漫234");
aoa.add("动漫2r");
aoa.add("动漫df");
aoa.add("动漫as");
aoa.add("动漫we");
aoa.add("动漫sdsf");
aoa.add("动漫fff");
aoa.add("动漫weeeeee");
//设置适配器
hgv.setAdapter(iba);
}
}
为啥要用这个呢,这个组件是Google官方推荐使用的,增加焦点处理的rv
,属于增强版,至于详细使用,或者其他更多的效果,后面再结合例子分享。这个系列会一直更新下去的。除非我不干TV了。
项目地址 https://gitee.com/dong_rong/android-tv-sample