【问题标题】:How to make customAdapter fill gridview height如何使customAdapter填充gridview高度
【发布时间】:2016-06-30 03:01:01
【问题描述】:

我正在开发数独应用程序。布局是 9x9 GridView。每个 GridView 包含 9 个由 customAdapter 提供的 Textview。我想让 9 个 TextView 填充每个 GridView 的高度。怎么样?

这就是我现在拥有的

这是我的GridAdapter:

public class myGridAdapter extends BaseAdapter {

private Context context;
private String[] mobileValues;

public myGridAdapter(MainActivity mainActivity, String[] arrayEmpty) {
    this.context = mainActivity;
    this.mobileValues = arrayEmpty;
}

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

    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View gridView;

    if (convertView == null) {

        gridView = new View(context);

        // get layout from text_item.xml
        gridView = inflater.inflate(R.layout.text_item, null);

        // set value into textview
        TextView textView = (TextView) gridView
                .findViewById(R.id.grid_item_label);
        textView.setText(mobileValues[position]);

    } else {
        gridView = (View) convertView;
    }

    return gridView;
}
.....
}

这是每个文本项的 XML

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

<TextView
    android:id="@+id/grid_item_label"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/cell_shape"
    android:text="@string/_1"
    tools:ignore="InefficientWeight"
    android:textSize="12sp" >
</TextView>

</LinearLayout>

这是每个 TextView 的形状

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<solid android:color="#FFFFFF"/>
<stroke android:width="1dp" android:color="#777777" />
</shape>

我希望我的 Gridview 像这样

应用 bakriOnFire 的第一个答案后

【问题讨论】:

  • 你的 GridView 的 LayoutParams 是什么。你是否将它的宽度和高度设置为 match_parent?
  • @bakriOnFire 我不以编程方式编辑 LayoutParams,我只依赖 XML 文件中的参数
  • yes..hav u 将其宽度和高度设置为 xml 中 GridView 的 match_parent ..
  • 您希望我修改哪个 XML 字段和哪个项目的高度和宽度? @bakriOnFire
  • @bakriOnFire Gridview 已经填充了父级,因为它的背景颜色(深灰色)正在拉伸到最后,如您所见。浅灰色是外部布局的背景色

标签: android android-layout android-gridview


【解决方案1】:

您可以将在 GridView 的适配器中膨胀的 TextView 的每个 LinearLayout 的高度设置为 screenHeight/3。

在getView中对textView的xml进行充气后,将充气后的view转换为LinearLayout,并将其高度设置为:

LayoutInflater li = getLayoutInflater();
LinearLayout ll = (LinearLayout) li.inflate(R.layout.menu_items, null);

int screenHeight = ((Activity) context).getWindowManager()
                    .getDefaultDisplay().getHeight();

ll.setMinimumHeight(screenHeight/3);

编辑

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent"
    android:layout_height="match_parent">

text_item.xml

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

<TextView
    android:id="@+id/grid_item_label"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    tools:ignore="InefficientWeight"
    android:padding="0dp"
    android:textSize="12sp" >
</TextView>

</LinearLayout>

MainActivity.java

public class MainActivity extends Activity {

    String[] str = { "1", "2", "3", "1", "2", "3", "1", "2", "3" ,
             "1", "2", "3", "1", "2", "3", "1", "2", "3" ,
             "1", "2", "3", "1", "2", "3", "1", "2", "3" ,
             "1", "2", "3", "1", "2", "3", "1", "2", "3" ,
             "1", "2", "3", "1", "2", "3", "1", "2", "3" ,
             "1", "2", "3", "1", "2", "3", "1", "2", "3" ,
             "1", "2", "3", "1", "2", "3", "1", "2", "3" ,
             "1", "2", "3", "1", "2", "3", "1", "2", "3" ,
             "1", "2", "3", "1", "2", "3", "1", "2", "3" };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        GridView gridView = (GridView) findViewById(R.id.gridView1);

        gridView.setAdapter(new myGridAdapter(this, str));

        gridView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                    int position, long id) {

            }

        });

    }

    public class myGridAdapter extends BaseAdapter {

        private Context context;
        private String[] mobileValues;

        public myGridAdapter(MainActivity mainActivity, String[] arrayEmpty) {
            this.context = mainActivity;
            this.mobileValues = arrayEmpty;
        }

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

            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            LinearLayout gridView;

            if (convertView == null) {

                // get layout from text_item.xml
                gridView = (LinearLayout)inflater.inflate(R.layout.text_item, null);

                int screenHeight = ((Activity) context).getWindowManager()
                        .getDefaultDisplay().getHeight();

                gridView.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.MATCH_PARENT, screenHeight/9));


                //gridView.setMinimumHeight(screenHeight/9);
                // set value into textview
                TextView textView = (TextView) gridView
                        .findViewById(R.id.grid_item_label);
                textView.setText(mobileValues[position]); 

            } else {
                gridView = (LinearLayout) convertView;
            }

            return gridView;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mobileValues.length;
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }
    }

}

在 getView 中,我将 text_item.xml 膨胀了 9x9 次,其中我动态地将 text_item 的布局高度设置为 screenHeight/9。 让我知道它是否适合您。

编辑 2

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
            android:layout_width="match_parent"
        android:layout_height="match_parent">
<GridView
        android:id="@+id/gridView1"
        android:layout_width="match_parent" 
        android:layout_height="match_parent"
        android:gravity="center"
        android:numColumns="9"
        android:padding="0dp"
        android:background="#000000"
        android:horizontalSpacing="3dp"
        android:verticalSpacing="3dp"
        android:stretchMode="columnWidth" >
    </GridView>
    </LinearLayout>

text_item.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:background="#FFFFFF"
android:orientation="vertical" >

<TextView
    android:id="@+id/grid_item_label"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    tools:ignore="InefficientWeight"

    android:padding="0dp"
    android:textSize="12sp" >
</TextView>

</LinearLayout>

【讨论】:

  • 你能不能把你的代码修改成我的例子。看不懂
  • 你会得到 gridView 的高度为 0 直到它被绘制..你可以通过计算来完成这一切..将每个 gridViews 的高度作为 screenHeight/3 并给出每个单元格的高度每个 gridview 为 screenHeight/9。
  • 让我看看我能不能用你的代码做点什么。如果我想出点什么,我会告诉你的。
  • 更改 activity_main.xml 和 text_item.xml 就像我的 Edit 2..你会得到边框。
  • 我看不到任何附件...行 int screenHeight = ((Activity) context).getWindowManager() .getDefaultDisplay().getHeight(); gridView.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.MATCH_PARENT, screenHeight/9)); 将拉伸网格单元以填充屏幕..我自己检查过...你做错了什么..只是检查它..
【解决方案2】:

您可以获得设备高度宽度和 3 行 n col 除以 3 并以编程方式设置高度宽度可能会解决您的问题。

【讨论】:

  • 请注意,我在 MainLayout 中有 9 个 Gridview,所以我认为我不能直接使用 ScreenHight。有没有办法获得 Gridview 高度?
  • 在 getView 中,你会在你的类中生成九个名为 gridView 的视图。我正在谈论每个项目的 xml。根据你的代码,你可以这样做 gridView.setLayoutParams(new LinearLayout.LayoutParams (宽度,高度));
【解决方案3】:

试试这个代码

<GridView
        android:id="@+id/gridView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"


        android:columnWidth="10dp"
        android:gravity="center"
        android:horizontalSpacing="10dp"
        android:numColumns="3"
        android:stretchMode="columnWidth"
        android:verticalSpacing="10dp" >
    </GridView>

这可能对你有帮助

【讨论】:

  • 感谢您的帮助,但问题仍然存在。此代码仅使间距变大,但单元格大小仍然相同
【解决方案4】:

请查看这个 soduku 的开源示例。

http://code.google.com/p/opensudoku-android/

这将帮助您绘制 9 X9 grdiview。

您好,这段代码。

<TextView   
        android:id="@+id/num"       
        android:text="1"
        android:gravity="center"
        android:textStyle="bold"        
        android:textColor="@android:color/darker_gray"
        android:textSize="25sp"     
        android:layout_centerInParent="true"
        android:layout_width="fill_parent"      
        android:layout_height="fill_parent">
    </TextView>

【讨论】:

【解决方案5】:

由于 GridView 将在您的适配器被调用并且没有每个单元格/子项的高度属性时起作用,因此您最好的选择可能是创建您想要的 w/h 图像并将其设置为 textView.SetBackGround。 ..

这是我用于数独应用程序的内容。它在 Play 商店中,请查看屏幕并告诉我您的想法。

在 PlayStore - EasySudoku,免费下载 - http://tinyurl.com/c4qra79

【讨论】:

  • 就是功能,但是界面呢?我想将每个 Square of 9 Textviews 分开,以便对用户更好看