【问题标题】:android - Multiple horizontalgridview with titleandroid - 带有标题的多个水平网格视图
【发布时间】:2016-06-24 06:27:38
【问题描述】:

我想创建多个水平网格视图,每个网格视图上面都有标题。我已经成功制作了,结果是我想要的,但是我的应用程序变得如此沉重。

我现在的看法是这样的:

我有一个 LinearLayout,其中包含一个 textview 和一个 Horizo​​ntalgridview。我们称之为 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 的示例

这个是main_layout里面的LinearLayout的例子(基本上和上一张图一样)。

我的问题是有没有人知道更好的解决方法,如何以及为什么? 谢谢!

编辑: 我正在创建一个 Android TV 应用程序,因此我需要将焦点集中在要导航的每个项目上。但是我在 RecyclerView 中尝试过 RecyclerView,内部 RecyclerView 无法获得焦点:(

【问题讨论】:

    标签: android android-layout gridview android-linearlayout android-tv


    【解决方案1】:

    首先你需要创建一个带有 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>
    

    【讨论】:

    • 我使用 Horizo​​ntalGridView (它也是来自leanback库的recyclerview)而不是带有水平布局管理器的 RecyclerView 但我认为它们基本上都是一样的。 “后裔”部分很重要,因为没有它,内部回收视图中的项目无法正确获得焦点!谢谢!
    【解决方案2】:

    基本上你的布局看起来像 Google Play 当前的设计。你可以通过使用包含水平 RecyclerViews 的 Single RecyclerView 和 TextView 作为标题来实现这一点。

    【讨论】:

    • 嗨!我刚试了你说的,但是里面的Horizo​​ntalGridView无法获取焦点。我忘了提到我正在创建一个电视应用程序,所以我需要关注每个项目
    • 焦点是什么意思。我不明白。我对电视应用一无所知。
    【解决方案3】:

    尝试使用TwoWayGridView。它可以用作普通 Android GridView 的替代品。 Android GridView 可以配置为水平或垂直滚动​​。

    属性:

    • scrollDirectionPortrait (vertical | Horizo​​ntal) - 当设备处于纵向时网格将滚动的方向
    • scrollDirectionLandscape (vertical | Horizo​​ntal) - 当设备处于横向时网格的滚动方向
    • numRows (integer) - 水平滚动模式下网格视图中的行数
    • verticalSpacing (dimension) - 网格行之间的垂直间距高度
    • 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"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多