20

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

正常情况 - 3 列

在此处输入图像描述

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

在此处输入图像描述

所需情况 - 3 列

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

提前致谢!

4

8 回答 8

3

我认为这根本不可能。

原因::

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

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

于 2014-05-28T10:17:24.533 回答
1

如果您将 GridLayoutManager 与 RecyclerView 一起使用,首先垂直填充数据的简单方法是:

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

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

于 2017-08-18T11:48:02.383 回答
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 才能获得此功能。

于 2013-02-14T09:40:37.670 回答
0

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

于 2013-06-18T10:30:39.760 回答
0

// 你用过 GridLayout这个吗,试试这个:

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);

于 2014-11-29T11:02:21.310 回答
0

我认为您需要https://github.com/ApmeM/android-flowlayout。并将子重力设置为Gravity.FILL_HORIZONTAL

他们甚至有verticalhorizontal方向

于 2016-08-05T00:19:29.570 回答
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
]

如果我们更改crossAxisCount4和更改arrayLength21(只是一个随机数。)


  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 的新手,请投票给我的答案以获得动力。

于 2021-05-27T12:54:12.940 回答
-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>
于 2013-11-07T05:13:46.607 回答