android - 带标题的多个水平网格视图

android - Multiple horizontalgridview with title

我想创建多个 horizo​​ntalgridview,每个 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(标题)和一个带有 Horizo​​ntal 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>