As most developers have found out, appwidgets break the normal rules when it comes to widget development.
Due to the abstract class ( appwidgetProvider ) and the updating through RemoteViews

You’re quite limited in the use of the different layout controls that are available.
namely :

  • FrameLayout
  • LinearLayout
  • RelativeLayout

So how do we get a table layout, that automatically expands or fills the available space?

The answer is clever use of of the weight attributes of linearLayout and the children components.
Here is an example of a timetable.

9 – 6 / Mon – friday.

Note* i have an image up the top right, you may wont to replace this with something else!

Scroll to the end for an example on how to loop through the cells

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

		<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
			android:src="@drawable/ul"
			android:layout_width="fill_parent"
  			android:layout_height="wrap_content"
  			android:layout_weight="1"
  			android:layout_marginTop="6dp"
  			android:adjustViewBounds="true"
  			android:maxHeight="30px"/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Mon" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Tue" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Wed" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Thu" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Fri" android:gravity="center"
		/>

	</LinearLayout>

	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="vertical" android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:layout_margin="0px" android:layout_weight="1.0" android:id="@+id/mainTable">	

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="09:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri9"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="10:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri10"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="11:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1"android:id="@+id/fri11"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="12:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri12"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="13:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri13"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="14:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri14"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="15:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri15"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="16:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon16"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/thu17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed16"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu16"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri16"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="17:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/thu17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri17"/>

		</LinearLayout>

	</LinearLayout>

</LinearLayout>

And just in case your wondering how you can easily loop through them

RemoteViews views = new RemoteViews( context.getPackageName() , R.layout.widget );

for ( int i = 9 ; i < 18 ; i++ )
{
	try
	{
	        int monid = R.id.class.getField( "mon" + i ).getInt( 0 );
		views.setOnClickPendingIntent( monid , this.createOnClickPendingIntent( context ) );

		int tueid = R.id.class.getField( "tue" + i ).getInt( 0 );
		views.setOnClickPendingIntent( tueid , this.createOnClickPendingIntent( context ) );

		int wedid = R.id.class.getField( "wed" + i ).getInt( 0 );
		views.setOnClickPendingIntent( wedid , this.createOnClickPendingIntent( context ) );

		int thuid = R.id.class.getField( "thu" + i ).getInt( 0 );
		views.setOnClickPendingIntent( thuid , this.createOnClickPendingIntent( context ) );

		int friid = R.id.class.getField( "fri" + i ).getInt( 0 );
		views.setOnClickPendingIntent( friid , this.createOnClickPendingIntent( context ) );

		Log.e( "done" , "Hour : " + i );
	}
	catch ( Exception k )
	{
		Log.e( "ffdsfdsfs" , "ERROR : " + k.getMessage() );
	}
}