Android GridView垂直加载项目

时间:2012-11-27 09:02:20

标签: android gridview

是否可以在GridView中以垂直方向加载项目?我的意思是......

正常情况 - 3列

enter image description here

-----------------------------             
1      |  2      |    3
-----------------------------
4      |  5      |    6

enter image description here

所需情况 - 3栏

-----------------------------              
1      |  3      |    5
-----------------------------
2      |  4      |    6

提前致谢!

8 个答案:

答案 0 :(得分:3)

我认为这根本不可能。

原因 ::

  • 由于我们想要垂直滚动项目,因此存在技术故障。而且屏幕上的渲染项目也是垂直方向。在这种情况下,我们无法在GridView的onLayout和onMeasure方法中完成我们需要进行的计算。
  • 如果尝试另一种方式,即我们中的一些人建议将数据源扼杀为[1,5,2,6,3,7,4,8,...],但在这种情况下什么是随机算法?< / LI>
  • 当用户垂直翻转时,您如何计算我们需要垂直渲染的项目数以及何时切换到下一列以渲染其他项目。没有这样的数学公式。

我对此做了一些工作并得出了这个结论。希望这可以回答未回答的问题。

答案 1 :(得分:1)

如果您使用GridLayoutManager与RecyclerView,首先填写垂直数据的简便方法是:

GridLayoutManager lLayout_artist = new GridLayoutManager(getActivity(),3,GridLayoutManager.HORIZONTAL, false);

您可以根据需要更改GridLayoutManager的方向。

答案 2 :(得分:0)

请澄清,说你有这样的网格

1  4  7
2  5  8
3  6  9

现在如果你垂直向下滚动,它应该基本上就像这样?

2  5  8
3  6  9
4  7  10

在这种情况下,

  • 第4项和第7项未被回收,实际上它们被移至新职位
  • 第1项将被回收
  • 仅介绍第10项

显然,这不是正常的ListView / GridView如何在一次回收行的情况下工作的方式,AFAIK您需要自定义GridView才能获得此功能。

答案 3 :(得分:0)

是否可以更改数据序列? 在您的示例中,将数据更改为[1,3,5,2,4,6,...]以获得水平方向,[1,5,2,6,3,7,4,8,...]垂直方向。

答案 4 :(得分:0)

//你曾经使用过GridLayout this,试试这个:

File -> Import -> <sdk_folder>\extras\android\support\v7\gridlayout>

//将此项目添加为库项目

// xml文件 - activity_main.xml

<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/gridLayout"
    tools:context="com.example.gridlayoutdemo.MainActivity" >

</android.support.v7.widget.GridLayout>

// Java代码

<强> MainActivity.class

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.GridLayout;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

    private GridLayout gridLayout;
    private TextView[] textViews;
    private int noOfItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        gridLayout = (GridLayout) findViewById(R.id.gridLayout);
        gridLayout.setOrientation(1);
        gridLayout.setColumnCount(3);
        gridLayout.setRowCount(3);

        textViews = new TextView[8];

        for (int i = 0; i < 8; i++) {
            textViews[i] = new TextView(MainActivity.this);
            textViews[i].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT));
            textViews[i].setText(String.valueOf(i));
            textViews[i].setTextSize(25);
            textViews[i].setPadding(50, 25, 10, 25);
            gridLayout.addView(textViews[i]);
        }

        setContentView(gridLayout);

        for (noOfItems = 0; noOfItems < 8; noOfItems++) {
            textViews[noOfItems].setOnClickListener(new View.OnClickListener() {

                int pos = noOfItems;

                public void onClick(View v) {
                    Toast.makeText(getBaseContext(), pos + " Clicked",
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

}

//如果你想水平显示 gridLayout.setOrientation(0);

答案 5 :(得分:0)

我认为你需要https://github.com/ApmeM/android-flowlayout。并将儿童引力设置为Gravity.FILL_HORIZONTAL

他们甚至有verticalhorizontal方向

答案 6 :(得分:0)

我知道这个问题有点老了..但我没有找到任何相关的答案,所以我创建了一个算法。

在下面的代码中,crossAxisCount 只不过是水平对齐的网格数量,即,在上图中的纵向视图中,我们有“2”个网格,而在横向视图中,我们有“4”个网格。 arrayLength 表示为获得该布局而必须提供的网格总数。

  final int crossAxisCount = 2;
  final int arrayLength = 8;
  final List<int> output = [];
  
  
  
  var runiCheck = 0;
  for (var i = 0; i < (arrayLength/ crossAxisCount).ceil(); i++) {
    var runjCheck = -1;
    for(var j = i; j <= arrayLength; j+= (arrayLength / crossAxisCount).ceil()){
      runiCheck++;
       if((arrayLength % crossAxisCount != 0)){
         if(arrayLength < runiCheck) break;
           runjCheck++; 
        if(arrayLength % crossAxisCount < runjCheck){
          j--;         
        }            
      }else{
         runjCheck++;   
         if(runjCheck >= crossAxisCount) break;        
       }     
      output.add(j);    
    }    

  }
  print(output);

输出:

[
0, 4,
1, 5, 
2, 6, 
3, 7
]

如果我们将 crossAxisCount 改为 4 并将 arrayLength 改为 21(只是一个随机数。)


  final int crossAxisCount = 4;
  final int arrayLength = 21;
  final List<int> output = [];
  
  

输出将是:

[
0, 6, 11, 16, 
1, 7, 12, 17, 
2, 8, 13, 18, 
3, 9, 14, 19, 
4, 10, 15, 20, 
5
]

我知道在很长的列表/数组中使用这个算法有点贵。但这是正确的解决方案。

我是 Stack Overflow 的新手,请为我的答案投票以获得动力。

答案 7 :(得分:-1)

您可以使用 GridLayout 代替GridView来实现此目的。

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="wrap_content"
       android:layout_height="match_parent"
       android:orientation="vertical"
       android:rowCount="2">
</GridLayout>