带有 CustomLayout 项和状态的 GridView

Posted

技术标签:

【中文标题】带有 CustomLayout 项和状态的 GridView【英文标题】:GridView with CustomLayout Items and State 【发布时间】:2012-08-18 13:01:29 【问题描述】:

我正在处理需要显示动态项目列表的布局。每个项目都有一个定义的 UUID、一个名称(横幅文本)、一个图像 URL 和一个布尔值以指示它是否被选中 - 我还创建了一个 POJO 来保存这些。我创建了一个自定义布局,将项目放在网格视图中,两个图标上带有横幅文本。它看起来像这样:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_ >
  <RelativeLayout
    android:id="@+id/ItemLayout"
    android:layout_
    android:layout_ >
    <ImageView
        android:id="@+id/ItemImage"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:background="@android:color/transparent" />
    <ImageView
        android:id="@+id/ItemOverlayImage"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:background="@android:color/transparent" />
    <TextView
        android:id="@+id/ItemTextBanner"
        android:layout_
        android:layout_
        android:layout_margin="2dp"
        android:background="#BF000000"
        android:gravity="center"
        android:textStyle="bold" />
  </RelativeLayout>
</FrameLayout>

我还创建了自定义适配器和活动,我在读取所有项目、下载图像并编码为位图以及设置文本横幅时没有问题。问题是如果单击该项目,我希望“选定”状态和图像发生变化。

我知道我可以添加GridView.setOnItemOnClickListener 并且在里面我知道哪个项目被选中以及它来自父视图,但我不确定如何让它处于“选中”状态。 This 链接使用适配器中静态列表中的状态,这是我所建模的。我添加了以下方法并从GridView.setOnItemOnClickListener调用它。

public void itemSelected(View parent, int position)

    if(items.get(position).isSelected())
    
        ImageView interestSelected = (ImageView)parent.findViewById(R.id.ItemOverlayImage);
        interestSelected.setImageResource(0);
    
    else
    
        ImageView interestSelected = (ImageView)parent.findViewById(R.id.ItemOverlayImage);
        interestSelected.setImageResource(R.drawable.overlay);          
    

第一个问题很明显,我没有将状态保存到我的 items 数组中,但这是一个简单的解决方法。真正的问题是只有第一个项目得到覆盖。那么如何更改所选 GridView 中项目的R.id.ItemOverlayImage 而不仅仅是第一个?还是我完全错了?

【问题讨论】:

【参考方案1】:

关于您的代码的几点说明:

您可能只得到第一个带有叠加层的项目,因为您在父级上使用 findViewById 搜索 GridView 而不是行视图 view,因此 findViewById 将返回第一个 ImageView它找到的(在第一个可见行上)。为了显示该覆盖,您可以根据您在适配器的getView 方法中使用的代码来选择如何执行此操作,如果您只想同时显示一个带有覆盖的项目(例如,当您单击一个项目,上一个被点击的项目(如果有的话)将取消选择)或者如果你有切换项目的选项(点击->覆盖,另一个点击->没有覆盖)。在不知道以上信息的情况下,我会这样做:

public void onItemClick (AdapterView<?> parent, View view, int position, long id) 
     ImageView overlay = (ImageView) view.findViewById(R.id.ItemOverlayImage);
     if (!items.get(position).isSelected())  // the item doesn't have an overlay
         overlay.setImageResource(R.drawable.overlay); // set the overlay
         items.setSelected(true); // set to true so the adapter knows it
      else  // the item has the overlay so we remove it
         overlay.setImageResource(0);
         items.setSelected(false); set to false so the adapter knows it
     

只要您在getView 方法中使用isSelected 设置或不设置覆盖,您就可以了。

您还应该删除包裹RelativeLayoutFrameLayout,因为您不会对它做任何事情(?!?)。

【讨论】:

谢谢,只要我开始使用视图而不是父视图,它就可以正常工作。我还删除了 FrameLayout 并且覆盖层看起来也找到了。我认为需要一个 FrameLayout 来将图像堆叠在一起。 @Luksprog 嘿,你能帮帮我吗?我想单击图像视图的事件和网格项的拖曳按钮。但不知道怎么做?

以上是关于带有 CustomLayout 项和状态的 GridView的主要内容,如果未能解决你的问题,请参考以下文章

在 Maven 中生成带有依赖项和测试的 jar 文件

React Hooks 表单处理:使用多个字符串项和一个数组项更新对象的状态

列表项和嵌套子菜单列表之间的间隙导致悬停状态丢失

R语言绘图-拼图

centos7 查看开机启动项和程序服务

使用导航栏按钮项和核心数据在视图控制器之间传递日期