【问题标题】:Add view between 2 rows Gridview在 2 行 Gridview 之间添加视图
【发布时间】:2013-07-04 17:35:32
【问题描述】:

我有一个 GridView,每行有 3 个元素,当我点击一个项目时,行下方会出现一个新视图。它有点像 iOS 上的文件夹应用程序。我没有在 SO 或 Google 上找到任何答案。也许你可以给我一些提示。

【问题讨论】:

  • 你发布的图片正是你想要的?
  • 或多或少。当我单击拇指时,我希望视图打开并实际显示详细信息:)
  • 是的,但是您是否想要与图像中相同的外观,基本上是新行(带有实际点击项目的指示符)?
  • 你为什么不试试ExpandableListView。并自定义其点击事件
  • 它实际上是我需要的 ExpendableGridView :/

标签: android gridview split row


【解决方案1】:

您可以使用GridLayout 轻松完成此操作,但使用GridView 则不行。

要在放置项目之前找出网格的可用宽度并设置列数,请设置 ViewTreeObserver.OnGlobalLayoutListener(然后可以放置项目)或扩展 GridLayout 并覆盖 onMeasure (int widthMeasureSpec, int heightMeasureSpec)

在每行内容之后插入一行,并将其可见性设置为Visibility.GONE,并将columnSpec 设置为GridLayout 的列数。当用户点击一个项目时,您可以获取它的信息、填充它下面的视图并展开或动画它的可见性切换。

最后,对于指示器,我只需将其添加为隐藏行的子项,当用户点击项目时,计算所述项目的水平中心并将该视图的中心准确放置在 X 轴上的坐标(为此,边距是可以的)。

请注意,对于非常大的项目列表,不建议这样做,因为您必须实例化每个项目以立即显示,无论它们是否都适合屏幕。与GridView 不同,GridLayout 不是AbsListView 的子代。

【讨论】:

  • 您可以为此添加示例代码吗?
【解决方案2】:

虽然这里显然没有原生组件来完成你想要做的事情,但是有几种方法可以通过结合其他方法来获得你想要的效果。

我能想到的一种方法是创建您自己的适配器并添加功能以在单击的行下方插入另外 3 个元素并标记为某种枚举,这样您就可以将其与常规视图区分开来,当然是在 getView 方法中对于适配器,您必须进行验证才能知道要膨胀并返回哪个视图,刷新视图后,这 3 个元素将插入到单击的元素下方,当然您可以通过修改适配器的列表来摆脱它们显示。 (这种方法需要对自定义适配器有很好的了解,我已经做过类似的事情,并且是一种干净而好的方法)。

解决此问题的另一种方法不如第一种方法好,但绝对可以解决问题,方法是创建一种您想要获得的效果的“模板”(就像您拥有的图片中的那种),保持该模板作为网格视图顶部活动的一部分不可见,一旦有人点击元素,根据您要显示的信息填充模板,使网格不可见并将“模板”显示在顶部网格,如果您想要显示的信息正确填充,用户不会注意到更改,当您想返回网格视图时,只需删除此“模板”视图,它就会产生网格保持原来的样子。

希望这会有所帮助。

问候!

【讨论】:

    【解决方案3】:

    我使用 TableLayout.addView 添加一个 ImageView,它可能需要另一个变量来删除视图,目前我只是删除它并在单击按钮时添加另一个。

    我通过他们的位置更改 imageView,您可以根据该位置更改背景,以便用户认为它与他们点击的那个相关

    ImageView imag; 
    boolean imageOn = false;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imag = new ImageView(this); 
        final TableLayout table = (TableLayout) findViewById( R.id.tableLayoutCategoryButtons );
        int buttonsInRow = 3;
        String[] itemNames = getResources().getStringArray(R.array.categories_array);
    
        int numRows=(itemNames.length/buttonsInRow);
        if (itemNames.length%buttonsInRow!=0)
            numRows++;
    
        Button[] buttons = new Button[itemNames.length];
        LinearLayout[] tablerowLayout = new LinearLayout[numRows];
        tablerowLayout[0] = new LinearLayout(table.getContext());
        int rowcount=0;
        for (int i=0; i<itemNames.length; i++){
            buttons[i]= new Button(table.getContext(), null, android.R.attr.buttonStyleSmall);
            buttons[i].setText(itemNames[i]);
            buttons[i].setId(i);
            buttons[i].setTextColor(Color.BLACK);
            buttons[i].setVisibility(View.VISIBLE);
            buttons[i].setOnClickListener(new OnClickListener(){
    
                @Override
                public void onClick(View v) {
                    if(imageOn){
                        table.removeView(imag);
                        imageOn = false;
                    }
                    int index = v.getId()/buttonsInRow+1;
                    if(v.getId()%buttonsInRow==1)
                        imag.setImageResource(R.drawable.reta);
                    else if(v.getId()%buttonsInRow==2)
                        imag.setImageResource(R.drawable.reta2);
                    else
                        imag.setImageResource(R.drawable.reta3);
    
                    imageOn = true;
                    table.addView(imag, index);
    
                }});
    
            LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            tablerowLayout[rowcount].addView(buttons[i], buttonLayoutParams);
    
            if (((i+1)%buttonsInRow==0)&&(i!=0)){
    
                table.addView(tablerowLayout[rowcount++]);
                if(rowcount<numRows)
                    tablerowLayout[rowcount] = new LinearLayout(table.getContext());
            }
        }
        if(rowcount<numRows)
            table.addView(tablerowLayout[rowcount]);
    

    【讨论】:

    • 没有办法对 GridView 做同样的事情?
    • 不,我不知道该怎么做。
    • @QuentinDOMMERC :您是否能够使用 gridView 实现相同的目标?如果你想通了,请帮忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多