当前位置: 首页 > 知识库问答 >
问题:

基于位置创建跨多个列和行的android gridview

瞿兴朝
2023-03-14

我想实现一个网格布局,它能够基于位置跨越多个行和列。假设跨度计数为3。项目位置零,取两行跨和两列跨,项目位置一取两列跨和一行跨项目位置二,取一列跨和一行跨项目位置三,取一列跨和一行跨

基本上,我希望视图根据其位置跨越各种列和行。

我尝试使用SetPansizeLookup方法使用回收视图的GridLayoutManager,但它跨越了水平或垂直视图。

我发现twowayview可以用于跨越多个列和行,但我不确定如何在我的项目中实现,因为它是一个广泛的库(在android studio中设置它时遇到问题)。

有人能提出最佳方法吗?

共有1个答案

颜云瀚
2023-03-14

在研究你的问题时,我学到了一些新的东西:我碰巧查看了GridLayoutManager for RecycleView,我注意到您可以设置自定义的SpanSizeLookup。现在,如果您垂直滚动,“跨度”只是一列,如果您水平滚动,则是一行。因此,SpanSizeLookup允许您指定例如,第0项需要2列,第1项需要1列,等等。

事实证明,如果您将RecycleView与GridLayoutManager一起使用,解决方案很简单:

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

    // Create a grid layout with two columns
    GridLayoutManager layoutManager = new GridLayoutManager(this, 2);

    // Create a custom SpanSizeLookup where the first item spans both 
 columns
    layoutManager.setSpanSizeLookup(new 
 GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return position == 0 ? 2 : 1;
        }
    });

    RecyclerView recyclerView = (RecyclerView)  
  findViewById(R.id.recyclerview);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(new MyGridAdapter());
   }

关于适配器的注意事项:RecyclerView。适配器与ListAdapter不兼容。您需要从RecyclerView扩展您的适配器。适配器并进行适当的更改。

以下是我为测试项目创建的适配器:

    public static class MyViewHolder extends RecyclerView.ViewHolder {

    ImageView mImageView;
    TextView mTextView;

    public MyViewHolder(View itemView) {
        super(itemView);
        mImageView = (ImageView) itemView.findViewById(R.id.imageView);
        mTextView = (TextView) itemView.findViewById(R.id.textView);
    }
   }

    public static class MyGridAdapter extends     
    RecyclerView.Adapter<MyViewHolder> {

    private int[] mDrawables;

    public MyGridAdapter() {
        this.mDrawables = new int[] {
                R.drawable.images_01,
                R.drawable.images_02,
                .
                .
                .
        };
    }

    @Override
    public int getItemCount() {
        return mDrawables.length;
    }

      @Override
      public MyViewHolder onCreateViewHolder(ViewGroup parent, int   
        viewType) {

        LayoutInflater inflater = (LayoutInflater) 
   parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.layout_grid_item, parent,  
       false);
        MyViewHolder holder = new MyViewHolder(view);
        // set up any onClickListener you need on the view here
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        holder.mImageView.setImageResource(mDrawables[position]);
        holder.mTextView.setText("Image " + position);
    }
   }






  Here xml of Activity


     <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="com.syneotek.gridlayoutmanagerdemo.Demo2">


 <android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/recyclerview">

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

 </RelativeLayout>

下面是网格item\u列表的xml

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical"
 >


  <ImageView
    android:id="@+id/grid_item_image"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@mipmap/ic_launcher" >
  </ImageView>

  <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/text1"
    android:layout_gravity="bottom"
    android:gravity="center"
    android:textStyle="bold"
    android:textAppearance="?android:textAppearanceMedium"
    android:text="Munaf Patel"/>

 </LinearLayout>


    Best of Luck.
 类似资料:
  • 我有一个这样的数据集 我想创建列(visit_no)。每当间隙大于1时,我们需要在接下来的行中将visit_no值增加1,直到我们找到另一个值,它将保持不变 这是数据框架

  • 谈到R编码,我目前有点墨守成规。我一直在尝试使用mutate、seq和rep函数来生成一个新列,该列迭代多个列值和不同的条件,但结果并不正确。下面是我的一些数据片段: 我希望按类型和特征 ID 对 lipidName 进行分组,然后查看类型特征 ID2,而不是不正确的数据表。如果它们具有相同的类型和特征 ID,则将它们计为脂质名称的相同脂质。如果它们具有相同的类型和特征ID2,则将它们计为脂质名称

  • 我想将我的自定义函数(它使用if-else梯形)应用到数据帧每行中的这六列(,,,,,)。 我已经尝试了不同的方法从其他问题,但似乎仍然不能找到正确的答案,我的问题。关键的一点是,如果这个人被算作西班牙裔,他们就不能算作其他任何东西。即使他们在另一个种族栏中有一个“1”,他们仍然被算作西班牙裔,而不是两个或两个以上的种族。类似地,如果所有ERI列的总和大于1,则被计为两个或两个以上的种族,不能被计

  • 我有一个国家和年份级别的面板数据集,我想根据现有的变量创建两个新变量。 我想做的是创建两个新变量集:(1)每年(跨国家)平均值的变量集和(2)国家/地区值相对于年平均值的变量集。例如,对于 var1(1) 将产生 mean_var1 和 (2) relmean_var1我希望这些变量用于所有其他变量。总的来说,数据集中有超过1000个变量,但我只将此函数应用于大约6个。 我有适用于第一部分的代码,

  • 我试图为数据集创建多水平条形图。这些数据涉及跑步比赛的比赛时间。 Dataframe有以下列:名称、年龄组、完成时间、完成地点、家乡。下面是示例数据。 我想创建一个类似下图的条形图。每个年龄组将有一个条形图,最快的跑步者在图表的底部,跑步者的名字与城市和次数跑了比赛低于他们的名字。 我需要一个for循环还是一个简单的groupby工作?每个年龄组的数量和大小可以根据种族动态变化,因此它不是一个常数

  • 问题内容: 我有一个时序DataFrame,我想复制我的200个功能/列中的每一个作为其他滞后功能。因此,目前我在时间t处具有要素,并希望在时间步t-1,t-2等处创建要素。 我知道最好用df.shift()来完成,但是我很难将其完全合并。我还想将列重命名为“功能(t-1)”,“功能(t-2)”。 我的伪代码尝试将是这样的: 最后,如果我有200列和4个滞后时间步长,那么我将拥有一个具有1000个