Android的GridView控件

GridView控件是可以用来显示二维排列的控件,这里在上一篇TabHost控件的基础上添加了一个GridView控件,用作Tab页的显示内容。

效果图:


帖代码:

public class OrderClientActivity extends Activity {
	TabHost tabHost;
	String[] dishType=new String[]{"1","2","3","4","5","6","7"};
	GridView gridView;
	
	String[] dishName=new String[]{"1","2","3","4","5","6","7","8","9","10","11","12"};
	String picPath=Environment.getExternalStorageDirectory().getPath() + "/picture/";
	
	GridViewAdapter gridViewAdapter;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.orderform);
        
        // 获取TabHost对象
		TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
		// 如果没有继承TabActivity时,通过该种方法加载启动tabHost
		tabHost.setup();
        
		gridView=(GridView)findViewById(R.id.view1);
		gridViewAdapter=new GridViewAdapter(this);
		gridView.setAdapter(gridViewAdapter);
		
		for(int i=0;i<dishType.length;i++){
			TabHost.TabSpec tabSpec=tabHost.newTabSpec(dishType[i]);
			tabSpec.setIndicator(dishType[i],getResources().getDrawable(R.drawable.ic_launcher));
		    tabSpec.setContent(R.id.view1);
			tabHost.addTab(tabSpec);
		}
		
		tabHost.setCurrentTab(1);
		tabHost.setCurrentTab(0);
		
		new AsyncLoadImage().execute(100);
    }
    
    class AsyncLoadImage extends AsyncTask<Object, Bitmap, Object>{

		@Override
		protected Object doInBackground(Object... params) {
			Bitmap bitmap;
			
			Log.i("加载线程", "");
			
			// TODO Auto-generated method stub
			for(int i=0;i<dishName.length;i++){
				Log.i("图片路径", picPath + dishName[i] + ".jpg");
				bitmap=BitmapFactory.decodeFile(picPath + dishName[i] + ".jpg");
				
				if(bitmap != null){
					publishProgress(bitmap);
					Log.i("图片解析", "正确");
				}
				else
					Log.i("图片解析", "错误");
			}
			return null;
		}

		@Override
		protected void onProgressUpdate(Bitmap... values) {
			// TODO Auto-generated method stub
			for(Bitmap b : values){
				gridViewAdapter.addPic(b);
				gridViewAdapter.notifyDataSetChanged();
			}
		}
 	
		
    }
    class GridViewAdapter extends BaseAdapter{

    	Context context;
    	private ArrayList<Bitmap> picList=new ArrayList<Bitmap>();
    	
    	GridViewAdapter(Context context){
    		this.context=context;
    	}
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return picList.size();
		}

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

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

		public void addPic(Bitmap bitmap){
			picList.add(bitmap);
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			Log.i("得到view", position + "");
			
			ImageView image = null;
			if(convertView == null){
				image=new ImageView(context);
				
			}
			else{
				image=(ImageView)convertView;
			}
			image.setLayoutParams(new GridView.LayoutParams((getWindowManager().getDefaultDisplay().getWidth()-3)/2,(int) (getWindowManager().getDefaultDisplay().getWidth()/2*0.6)));//设置ImageView对象布局 
            image.setAdjustViewBounds(true);//设置边界对齐 
            image.setScaleType(ImageView.ScaleType.FIT_XY);//设置刻度的类型 
            image.setPadding(0, 0, 0, 0);//设置间距 
			image.setImageBitmap(picList.get(position));
			return image;
		}
    	
    }
}
GridView需要通过Adapter来加载需要显示的内容,在这里我们自定义了BaseAdapter,必须实现几个方法,其中getCount()和getView()是必须实现的方法,getView()用来提供GridView显示的每一个Item。关于Adapter的详细情况可以参考  Android之Adapter用法总结

另外,实际的运行过程中,发现Gridview的图片加载很卡,所以我们改成了异步加载图片,用到了AsyncTask类,这是Android提供的一个轻量级的线程既能在后台线程中执行一些耗时操作,又有方法直接更新ui,关于AsyncTask的详细介绍可以参考:android AsyncTask介绍

这里如果没有必要用到异步加载,可以在GridViewAdapter里直接给picList赋值。


布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
	android:id="@+id/hometabs"
	android:orientation="vertical"
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent">
    <!-- TabHost必须包含一个 TabWidget和一个FrameLayout--> 
    <TabHost android:id="@+id/tabhost"
     	android:layout_width="fill_parent"
     	android:layout_height="wrap_content"
     	android:layout_weight="1">
     	<LinearLayout
			android:orientation="vertical"
			android:layout_width="fill_parent"
			android:layout_height="fill_parent">
			<HorizontalScrollView
			    android:layout_width="fill_parent"
			    android:layout_height="wrap_content"
			    android:scrollbars="none">
			    <!-- TabWidget的id属性必须为 @android:id/tabs-->			
	     	  	<TabWidget android:id="@android:id/tabs" 
		      	android:orientation="horizontal"
		      	android:layout_width="fill_parent"
		      	android:layout_height="wrap_content">
	        	</TabWidget>
			</HorizontalScrollView>
			
	     	<!-- FrameLayout的id属性必须为 @android:id/tabcontent-->
		     <FrameLayout 
		          android:id="@android:id/tabcontent"
			      android:layout_width="fill_parent"
			      android:layout_height="fill_parent">
			      
			      <GridView 
			          android:id="@+id/view1"
			          android:listSelector="#000000"
			          android:layout_width="fill_parent"
			          android:layout_height="wrap_content"
			          android:padding="0dip"
			          android:layout_margin="0dip"
			          android:numColumns="2"
			          android:horizontalSpacing="3dip"
			          android:verticalSpacing="3dip"
			          android:stretchMode="columnWidth"
			          android:gravity="fill"/>"
			    	
		     </FrameLayout>
	     
	     </LinearLayout>
    </TabHost>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hha"/>
        <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hha2"/>
        <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hha3"/>
    </LinearLayout>
    
</LinearLayout>

在布局文件里看到,GridView设置了一个属性android:listSelector,这个属性用来设置GridView的每个item 的背景。如果没有设置这个属性,每个item在点击的时候都有一个蓝色边框,我们可以设置成我们想要的颜色,不想显示的话可以直接设置成背景色。

下一篇介绍GridView的更复杂的用法。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,在布局文件中添加GridView控件: ```xml <GridView android:id="@+id/gridView" android:layout_width="match_parent" android:layout_height="wrap_content" android:numColumns="6" android:verticalSpacing="1dp" android:horizontalSpacing="1dp" android:columnWidth="match_parent" android:stretchMode="columnWidth" android:gravity="center_horizontal" /> ``` 这里我们设置GridView的列数为6,每个单元格之间的垂直和水平间距为1dp,每个单元格的宽度和高度都根据列宽自适应,且单元格宽度均匀分配。 接下来,我们需要定义每个单元格的布局。在res/layout目录下新建一个课程表单元格的布局文件,例如course_cell.xml,代码如下: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/cell_bg" android:padding="5dp"> <TextView android:id="@+id/tv_course_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/white" android:textSize="14sp" /> <TextView android:id="@+id/tv_course_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/white" android:textSize="12sp" /> </LinearLayout> ``` 这里我们使用LinearLayout作为根布局,设置了背景、内边距和垂直方向的线性布局。在线性布局中添加了两个TextView控件,分别用于显示课程名称和时间。 最后,在代码中设置GridView的适配器,为每个单元格填充数据。我们可以创建一个Course类来保存每个单元格的数据,例如课程名称和时间等。 ```java public class Course { private String name; private String time; public Course(String name, String time) { this.name = name; this.time = time; } public String getName() { return name; } public String getTime() { return time; } } ``` 然后,在Activity中定义一个List<Course>类型的数据集合,用于保存所有课程的数据。并创建一个GridViewAdapter适配器类,用于为GridView填充数据。 ```java public class GridViewAdapter extends BaseAdapter { private Context context; private List<Course> courses; public GridViewAdapter(Context context, List<Course> courses) { this.context = context; this.courses = courses; } @Override public int getCount() { return courses.size(); } @Override public Object getItem(int position) { return courses.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.course_cell, parent, false); } Course course = courses.get(position); TextView tvName = convertView.findViewById(R.id.tv_course_name); TextView tvTime = convertView.findViewById(R.id.tv_course_time); tvName.setText(course.getName()); tvTime.setText(course.getTime()); return convertView; } } ``` 最后,在Activity中设置GridView的适配器,将数据填充到每个单元格中。 ```java public class MainActivity extends AppCompatActivity { private GridView gridView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gridView = findViewById(R.id.gridView); List<Course> courses = new ArrayList<>(); courses.add(new Course("语文", "周一 1-2节")); courses.add(new Course("数学", "周二 3-4节")); courses.add(new Course("英语", "周三 5-6节")); courses.add(new Course("物理", "周四 7-8节")); courses.add(new Course("化学", "周五 9-10节")); gridView.setAdapter(new GridViewAdapter(this, courses)); } } ``` 这样,我们就可以使用GridView控件来实现课程表的布局了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值