在两行Gridview之间添加视图

时间:2013-07-04 17:35:32

标签: android gridview split row

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

enter image description here

3 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:0)

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

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

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

希望这有帮助。

问候!

答案 2 :(得分:0)

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

我根据位置更改了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]);

simulation based on code