如何在Android中创建自定义网格视图(类似于矩阵结构)

3
我想创建一个类似于GridView的矩阵,比如10x20的矩阵。
我们希望能够指定视图的行数和列数,即10x20。
如果屏幕较小,则应该可以水平和垂直滚动。例如下面的图片描述了矩阵GridView。每个单元格表示(0,0) (0,1)等等...(1,0) (1,1)等等...
如何生成这种类型的视图呢? 提前感谢....!!! enter image description here

1
创建自定义的 GridView - Rustam
@Rustam,你能否给一些指导方针? - kukku
1
参见 https://gist.github.com/pskink/4918ec060a244540dcca - pskink
@pskink,请指导我如何使用这个?您能给我一个例子吗? - kukku
抱歉,我所有的测试代码都已经被删除了。 - pskink
@pskink 没关系,谢谢 :) - kukku
3个回答

6

请尝试以下内容:

GridView自定义适配器

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;

public class GridViewCustomAdapter extends BaseAdapter {

    ArrayList<String> items;

    static Activity mActivity;

    private static LayoutInflater inflater = null;

    public GridViewCustomAdapter(Activity activity, ArrayList<String> tempTitle) {
        mActivity = activity;
        items = tempTitle;

        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public final int getCount() {

        return items.size();

    }

    @Override
    public final Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public final long getItemId(int position) {

        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        View v = null;

        v = inflater.inflate(R.layout.item, null);

        Button tv = (Button) v.findViewById(R.id.button);
        tv.setText(items.get(position));

        return v;
    }

}

gridview.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:background="@android:color/white"
    android:orientation="vertical" >

    <GridView
        android:id="@+id/grid_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnWidth="20dip"
        android:gravity="center"
        android:horizontalSpacing="2dp"
         android:verticalSpacing="2dp"
        android:numColumns="20"
        android:stretchMode="columnWidth" >
    </GridView>

</LinearLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/button"
    android:layout_width="80dip"
    android:layout_height="80dip"
    android:textSize="10sp"
    android:background="@android:color/holo_blue_light"
    android:textColor="@android:color/black"
    android:textStyle="bold" />

GridViewActivity

公共类 GridViewActivity 扩展了 Activity 类。

private GridView list;
ArrayList<String> data = new ArrayList<>();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gridview);
    for (int i = 0; i < 10; i++) {
        for(int j=0;j<20;j++)
        data.add(i+"-"+j);
    }
    GridViewCustomAdapter adapter = new GridViewCustomAdapter(this, data);

    list = (GridView) findViewById(R.id.grid_view);
    list.setAdapter(adapter);

}

输出:

输入图像说明


谢谢您的回答,我知道这一点,但是GridView只会在屏幕宽度内显示您指定的列,如果宽度较小,则会采取这种方式,这对我来说是一个问题。 - kukku

2
可以通过使用GridLayout和动态单元格创建来实现。

/* * 版权所有 2012 Jess Anders * * 根据 Apache 许可证 2.0 版(“许可证”)获得许可; * 您不得使用此文件,除非符合许可证的规定。 * 您可以在以下位置获取许可证副本: * * http://www.apache.org/licenses/LICENSE-2.0 * * 除非适用法律要求或书面同意,否则根据许可证分发的软件是基于“原样”分发的, * 不附带任何明示或暗示的保证或条件。 * 有关管理权限下的权限,请参阅许可证。 */

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.GridLayout;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    GridLayout gl;
    TextView[] text;
    int item;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        gl = new GridLayout(MainActivity.this);
        gl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT));
        gl.setOrientation(0);
        gl.setColumnCount(11);
        gl.setRowCount(3);

        text = new TextView[100];
        ScrollView sv = new ScrollView(this);
        sv.setScrollbarFadingEnabled(false);
        HorizontalScrollView scrolview = new HorizontalScrollView(this);
        scrolview.setScrollbarFadingEnabled(false);
        LinearLayout linearLayout = new LinearLayout(this);
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
        linearLayout.setLayoutParams(params);
        linearLayout.setOrientation(LinearLayout.HORIZONTAL);
        linearLayout.addView(sv);
        sv.addView(scrolview);
        scrolview.setHorizontalScrollBarEnabled(true);
        setContentView(linearLayout);
        for (int i = 0; i < 100; i++) {
            for (int j = 0; i < 10; j++) {
                text[i] = new TextView(MainActivity.this);
                text[i].setLayoutParams(new LayoutParams(
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                text[i].setText(String.valueOf(i) + "," + String.valueOf(j));
                text[i].setTextSize(25);
                text[i].setPadding(50, 25, 10, 25);
                text[i].setOnClickListener(new View.OnClickListener() {

                    int pos = item;

                    public void onClick(View v) {

                        Toast.makeText(getBaseContext(), pos + " Clicked",
                                Toast.LENGTH_SHORT).show();
                    }
                });
                gl.addView(text[i]);
            }
        }

        scrolview.addView(gl);

    }

 }

这不是直接的解决方案,但我认为我需要定制GridView,而我目前并不知道如何做。


0

嗨,这是我创建的一个代码,用于创建一个按钮矩阵“x”

package com.example.andre.aplicacaocalibracaov2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    GridView gridView;
    List<String> lstSource = new ArrayList<>();

    String[] array_caracteres={
      "x"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setUpList();
        GridView gridView = (GridView) findViewById(R.id.gridView);
        //é a classe gridadapter
        GridAdapter adapter = new GridAdapter(lstSource,MainActivity.this);
        gridView.setAdapter(adapter);


    }
        public void setUpList() {
            for (String item : array_caracteres)
                for (int i = 0; i < 10; i++) {
                    for (int j = 0; j < 10; j++)
                        lstSource.add(item);
                }
        }
}


GridAdapter.java

package com.example.andre.aplicacaocalibracaov2;

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;

import java.util.List;

public class GridAdapter extends BaseAdapter {

    private Context context;
    List<String> lstSource;

    public GridAdapter(List<String>lstSource, Context context){
        this.lstSource = lstSource;
        this.context=context;


    }
    @Override
    public int getCount() {

        return lstSource.size();
    }

    @Override
    public Object getItem(int position) {

        return lstSource.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final Button button;
        if(convertView ==null){
            button = new Button(context);
            button.setLayoutParams(new GridView.LayoutParams(85,85));
            button.setPadding(8,8,8,8);
            button.setText(lstSource.get(position));
            button.setBackgroundColor(Color.YELLOW);
            button.setOnClickListener(new View.OnClickListener(){
                public void onClick(View v){
                    Toast.makeText(context,button.getText().toString(),Toast.LENGTH_SHORT).show();
                }
            });


        }
        else
            button=(Button)convertView;
        return button;
    }
}

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingBottom="16dp"
    tools:context=".MainActivity"

    >

    <GridView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/gridView"
        android:columnWidth="30dp"
        android:numColumns="auto_fit"
        android:stretchMode="columnWidth"
        android:verticalSpacing="4dp"
        android:horizontalSpacing="4dp"
        android:gravity="center"
        android:layout_centerInParent="true"
 />


</RelativeLayout>

祝你好运!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接