android - 带标题的多个水平网格视图
android - Multiple horizontalgridview with title
我想创建多个 horizontalgridview,每个 gridview 上面都有标题。我已经成功制作并且结果符合我的要求,但是我的应用程序变得如此沉重。
我现在的看法是这样的:
我有一个包含文本视图和水平网格视图的 LinearLayout。我们称它为 item_layout
我将动态添加多个item_layout到main_layout中的自定义LinearLayout(我将其命名为SectionedView)。代码大致是这样的(不是我的真实代码):
public class SectionedView extends LinearLayout{
...
public void setData(ArrayList<Object> object){
for(Object o:object){
View view = ...
title = (TextView)view.findViewById(R.id.title);
gridView = (GridView)view.findViewById(R.id.content);
title.setText(o.getTitle());
adapter = new Adapter(o.getItems());
gridView.setAdapter(adapter);
addView(view);
}
}
...
}
main_layout 中的自定义 LinearLayout 位于 ScrollView 内。
这是 main_layout 的示例
这个是LinearLayout inside main_layout的例子(和上图基本一样)
我的问题是有没有人知道更好的解决方法、方法和原因?
谢谢!
编辑:
我正在创建一个 Android 电视应用程序,因此我需要关注每个要导航的项目。但是我在 RecyclerView 里面试过 RecyclerView,里面的 RecyclerView 无法获得焦点:(
基本上你的布局看起来像 Google Play current design.You 可以通过使用包含水平 RecyclerView 的单个 RecyclerView 以 TextView 作为标题来实现这一点。
尝试使用TwoWayGridView
。它可以用作普通 Android GridView 的直接替代品。 Android GridView 可以配置为水平或垂直滚动。
属性:
- scrollDirectionPortrait(垂直 | 水平) - 当设备处于纵向时网格滚动的方向
- scrollDirectionLandscape(垂直 | 水平) - 当设备处于横向时网格滚动的方向
- numRows(整数) - 在水平滚动模式下网格视图中的行数
- verticalSpacing(维度) - 网格行之间的垂直间距高度
- rowHeight(维度) - 每个网格行的高度
下面是演示布局中的一个示例,它被配置为纵向滚动和横向滚动:
<?xml version="1.0" encoding="utf-8"?>
<com.jess.ui.TwoWayGridView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#E8E8E8"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:cacheColorHint="#E8E8E8"
app:columnWidth="80dp"
app:rowHeight="80dp"
app:numColumns="auto_fit"
app:numRows="auto_fit"
app:verticalSpacing="16dp"
app:horizontalSpacing="16dp"
app:stretchMode="spacingWidthUniform"
app:scrollDirectionPortrait="vertical"
app:scrollDirectionLandscape="horizontal"
app:gravity="center"/>
首先您需要创建一个带有 Vertical LayoutManager 的 RecyclerView。
recyclerView 项目将是一个 TextView(标题)和一个带有 Horizontal LayoutManager 的 RecyclerView。
在水平 RecyclerView 中,您将放置您的内容。
要让 RecyclerView 的项目获得焦点,您需要在 RecyclerView 中放置 android:descendantFocusability="afterDescendants"
。
对于您可能需要添加的项目:
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
您可能会遇到初始焦点的问题,但在这种情况下,您需要手动设置,在需要启动焦点的视图中使用yourView.requestFocus()
。
然后只需为 RecyclerView 项目添加一个 Drawable,指示它是否获得焦点。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/your_pressed" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/your_focused" /> <!-- focused -->
<item android:state_hovered="true"
android:drawable="@drawable/your_hovered" /> <!-- hovered -->
<item android:drawable="@drawable/your_default" /> <!-- default --> </selector>
我想创建多个 horizontalgridview,每个 gridview 上面都有标题。我已经成功制作并且结果符合我的要求,但是我的应用程序变得如此沉重。
我现在的看法是这样的:
我有一个包含文本视图和水平网格视图的 LinearLayout。我们称它为 item_layout
我将动态添加多个item_layout到main_layout中的自定义LinearLayout(我将其命名为SectionedView)。代码大致是这样的(不是我的真实代码):
public class SectionedView extends LinearLayout{
...
public void setData(ArrayList<Object> object){
for(Object o:object){
View view = ...
title = (TextView)view.findViewById(R.id.title);
gridView = (GridView)view.findViewById(R.id.content);
title.setText(o.getTitle());
adapter = new Adapter(o.getItems());
gridView.setAdapter(adapter);
addView(view);
}
}
...
}
main_layout 中的自定义 LinearLayout 位于 ScrollView 内。
这是 main_layout 的示例
这个是LinearLayout inside main_layout的例子(和上图基本一样)
我的问题是有没有人知道更好的解决方法、方法和原因? 谢谢!
编辑: 我正在创建一个 Android 电视应用程序,因此我需要关注每个要导航的项目。但是我在 RecyclerView 里面试过 RecyclerView,里面的 RecyclerView 无法获得焦点:(
基本上你的布局看起来像 Google Play current design.You 可以通过使用包含水平 RecyclerView 的单个 RecyclerView 以 TextView 作为标题来实现这一点。
尝试使用TwoWayGridView
。它可以用作普通 Android GridView 的直接替代品。 Android GridView 可以配置为水平或垂直滚动。
属性:
- scrollDirectionPortrait(垂直 | 水平) - 当设备处于纵向时网格滚动的方向
- scrollDirectionLandscape(垂直 | 水平) - 当设备处于横向时网格滚动的方向
- numRows(整数) - 在水平滚动模式下网格视图中的行数
- verticalSpacing(维度) - 网格行之间的垂直间距高度
- rowHeight(维度) - 每个网格行的高度
下面是演示布局中的一个示例,它被配置为纵向滚动和横向滚动:
<?xml version="1.0" encoding="utf-8"?>
<com.jess.ui.TwoWayGridView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#E8E8E8"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:cacheColorHint="#E8E8E8"
app:columnWidth="80dp"
app:rowHeight="80dp"
app:numColumns="auto_fit"
app:numRows="auto_fit"
app:verticalSpacing="16dp"
app:horizontalSpacing="16dp"
app:stretchMode="spacingWidthUniform"
app:scrollDirectionPortrait="vertical"
app:scrollDirectionLandscape="horizontal"
app:gravity="center"/>
首先您需要创建一个带有 Vertical LayoutManager 的 RecyclerView。 recyclerView 项目将是一个 TextView(标题)和一个带有 Horizontal LayoutManager 的 RecyclerView。 在水平 RecyclerView 中,您将放置您的内容。
要让 RecyclerView 的项目获得焦点,您需要在 RecyclerView 中放置 android:descendantFocusability="afterDescendants"
。
对于您可能需要添加的项目:
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
您可能会遇到初始焦点的问题,但在这种情况下,您需要手动设置,在需要启动焦点的视图中使用yourView.requestFocus()
。
然后只需为 RecyclerView 项目添加一个 Drawable,指示它是否获得焦点。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/your_pressed" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/your_focused" /> <!-- focused -->
<item android:state_hovered="true"
android:drawable="@drawable/your_hovered" /> <!-- hovered -->
<item android:drawable="@drawable/your_default" /> <!-- default --> </selector>