研究了一下Android的GridView,但是默认的GridView只支持垂直滚动,不支持水平滚动,有时我们为了实现表格效果,想达到水平和垂直均有滚动条,可以利用下面方法实现)。

1)main.xml  -- 布局文件

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:alwaysDrawnWithCache="true"

android:orientation="vertical"

android:scrollbarAlwaysDrawHorizontalTrack="true"

android:scrollbarAlwaysDrawVerticalTrack="true"

android:scrollbars="horizontal|vertical" >

android:layout_width="wrap_content"

android:layout_height="fill_parent" >

android:id="@+id/data_gridview"

android:layout_width="1395dip" 

android:layout_height="fill_parent"

android:layout_gravity="center"

android:background="#ff0000"

android:columnWidth="31dip"

android:gravity="center"

android:numColumns="45"         

android:scrollbarAlwaysDrawHorizontalTrack="true"

android:scrollbarAlwaysDrawVerticalTrack="true"

android:scrollbars="horizontal|vertical"

android:horizontalSpacing="1dip" 

android:verticalSpacing="1dip" />

2) 每个gridcell对应的layout文件 --

imagecell.xml

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true" >

3)Activity的代码 -- 这里为了提高性能,实现了重用View的机制

package com.xxxx.ui

import xxxx.xxxx

public class GridViewTestActivity extends Activity {

private int disp_rows = 20;  //显示多少行

private final static int COLUMN_CNT = 45; //显示多少列,这个要和layout文件里面对应起来

private GridView dataGridView;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

dataGridView = (GridView) findViewById(R.id.data_gridview);

dataGridView.setNumColumns(COLUMN_CNT);//一共45列

dataGridView.setAdapter(new CellAdapter(getApplicationContext()));

dataGridView.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View v, int position, long id) {

Toast.makeText(GridViewTestActivity.this, "" + position, Toast.LENGTH_SHORT).show();

}

});

} //end onCreate

class CellAdapter extends BaseAdapter {

private Context mContext;

private LayoutInflater mInflater;

public CellAdapter(Context c) {

mContext = c;

mInflater = LayoutInflater.from(c);

}

public int getCount() {

return (disp_rows * COLUMN_CNT);  //行数x列数为一共要显示多少个格子

}

public Object getItem(int position) {

return null; //do nothing now

}

public long getItemId(int position) {

return 0;

}

// create a new ImageView for each item referenced by the Adapter

// ImageView 放在了自定义的格子排版文件中,可以扩展使用,也就是说,格子显示的内容可以自己扩展

@Override

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

int row = getRow(position); //获取该格子对应表格的行和列

int column = getColumn(position);

ImageView imageView;

if (convertView == null) {

convertView = mInflater.inflate(R.layout.imagecell, null);

//这里也可以不用自己定义的imagecell排版,而直接使用如TextView 或 ImageView等作为一个格子的显示,这里演示自定义排版是为了扩展使用

//imageView = new ImageView(mContext);  //直接使用ImageView

}  //重用View,提高性能 else  {

// imageView = (ImageView) convertView;   //直接使用ImageView时

}

imageView = (ImageView) convertView.findViewById(R.id.CellImage); //如果直接使用ImageView,这一行不要

imageView.setBackgroundColor(Color.BLACK);

imageView.setImageResource(R.drawable.cellimage);

imageView.refreshDrawableState();

return convertView;

}

private final int getRow(int position) {

return (position / COLUMN_CNT);

}

private final int getColumn(int position) {

return (position % COLUMN_CNT);

}

}

}

以上即可实现利用GridView实现二维表格效果,性能也不错,而且有垂直和水平均有滚动条。

优点:性能好,可以利用自定义Layout作为每个格子的显示,同时可以进一步扩展CellAdapter 的getView方法,根据convertView instanceOf ImageView 或 TextView实现有的格子里显示文本,有的格子里显示图片, 从而达到图片和文字同时显示的效果。

缺点:  每个格子的大小必须相同,同时显示图片和文字时,比较难调整显示效果,当然有耐心的同学可以试试,理论上可以做到图文同时显示,而且支持不同格子的大小显示(即有的格子显示大,有的格子显示小,根据格子显示的内容动态的显示格子的大小),搞出来的同学请告知我一声,我学习学习。0b1331709591d260c1c78e86d0c51c18.png

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐