Brilliant work! Exactly what I was looking for!

On Monday, August 30, 2010 3:43:10 PM UTC-7, Ed wrote:
>
> Ok... so I was bored so.... 
>
> Uses spreadsheet.xml which contains a LinearLayout with the id 
> layout_spreadsheet. There are some tweaks that could be made like 
> making the top left cell outside the left scroll but I'm sure you can 
> figure that out. Allowing for dynamic sized cols/rows might be an 
> interesting challenge for you. 
>
> But other than that - here is a working implementation of a 
> spreadsheet view. Enjoy. 
>
> import java.text.DecimalFormat; 
> import java.util.ArrayList; 
> import android.app.Activity; 
> import android.content.Context; 
> import android.os.Bundle; 
> import android.widget.HorizontalScrollView; 
> import android.widget.LinearLayout; 
> import android.widget.ScrollView; 
> import android.widget.TableLayout; 
> import android.widget.TableRow; 
> import android.widget.TextView; 
>
> public class Launcher extends Activity { 
>     /** Called when the activity is first created. */ 
>     @Override 
>     public void onCreate(Bundle savedInstanceState) { 
>         super.onCreate(savedInstanceState); 
>         setContentView(R.layout.spreadsheet); 
>
>         final int ROW_HEIGHT = 50; 
>         final int COL_WIDTH = 80; 
>         final int NUM_COLS_AND_ROWS = 15; //keeping it square just 
> because i'm lazy 
>
>         String[] cols = new String[NUM_COLS_AND_ROWS]; 
>         String[] rows = new String[NUM_COLS_AND_ROWS]; 
>         String[][] data = new String[NUM_COLS_AND_ROWS] 
> [NUM_COLS_AND_ROWS]; 
>         DecimalFormat twoPlaces = new DecimalFormat("0.00"); 
>         for(int i = 0; i < NUM_COLS_AND_ROWS; i++) 
>         { 
>           cols[i] = "Col" + i; 
>           rows[i] = "Row" + i; 
>           for(int j = 0; j < NUM_COLS_AND_ROWS; j++) 
>           { 
>             data[i][j] = twoPlaces.format(Math.random() * 1000); 
>           } 
>         } 
>
>
>         LinearLayout layout = 
> (LinearLayout)findViewById(R.id.layout_spreadsheet); 
>
>         //setup left column with row labels 
>         LinkedScrollView lsvLeftCol = new LinkedScrollView(this); 
>         lsvLeftCol.setVerticalScrollBarEnabled(false); //this one will 
> look wrong 
>         TableLayout tlLeftCol = new TableLayout(this); 
>         TableLayout.LayoutParams tlLeftColParams = new 
> TableLayout.LayoutParams(); 
>         tlLeftColParams.width= COL_WIDTH; 
>         tlLeftCol.setLayoutParams(tlLeftColParams); 
>         for(int i = -1; i < rows.length; i++) 
>         { 
>           TableRow tr = new TableRow(this); 
>           TextView tv = new TextView(this); 
>           if(i >= 0) //-1 is the blank top left cell - this should 
> really be outside the scroll to look right 
>           { 
>             tv.setText(rows[i]); 
>           } 
>           tr.addView(tv); 
>           tr.setMinimumHeight(ROW_HEIGHT); 
>           tlLeftCol.addView(tr); 
>         } 
>         lsvLeftCol.addView(tlLeftCol); 
>
>         //add the main horizontal scroll 
>         HorizontalScrollView hsvMainContent = new 
> HorizontalScrollView(this); 
>         hsvMainContent.setHorizontalScrollBarEnabled(false); //you 
> could probably leave this one enabled if you want 
>
>         LinearLayout llMainContent = new LinearLayout(this); //Scroll 
> view needs a single child 
>         llMainContent.setOrientation(LinearLayout.VERTICAL); 
>
>         //add the headings 
>         TableLayout tlColHeadings = new TableLayout(this); 
>         TableRow trHeading = new TableRow(this); 
>         trHeading.setMinimumHeight(ROW_HEIGHT); 
>         for(int i = 0; i < cols.length; i++) 
>         { 
>           TextView tv = new TextView(this); 
>           tv.setText(rows[i]); 
>           tv.setMinWidth(COL_WIDTH); 
>           trHeading.addView(tv); 
>         } 
>
>         tlColHeadings.addView(trHeading); 
>         llMainContent.addView(tlColHeadings); 
>
>         //now lets add the main content 
>         LinkedScrollView lsvMainVertical = new LinkedScrollView(this); 
>         lsvMainVertical.setVerticalScrollBarEnabled(false); //this 
> will not be visible most of the time anyway 
>
>         TableLayout tlMainContent = new TableLayout(this); 
>
>         for(int i = 0; i < rows.length; i++) 
>         { 
>           TableRow tr = new TableRow(this); 
>           tr.setMinimumHeight(ROW_HEIGHT); 
>           for(int j = 0; j < cols.length; j++) 
>           { 
>             TextView tv = new TextView(this); 
>             tv.setText(data[i][j]); 
>             tv.setMinWidth(COL_WIDTH); 
>             tr.addView(tv); 
>           } 
>           tlMainContent.addView(tr); 
>         } 
>
>         lsvMainVertical.addView(tlMainContent); 
>
>         llMainContent.addView(lsvMainVertical); 
>
>         hsvMainContent.addView(llMainContent); 
>
>         layout.addView(lsvLeftCol); 
>         layout.addView(hsvMainContent); 
>
>         //the magic 
>         lsvMainVertical.others.add(lsvLeftCol); 
>         lsvLeftCol.others.add(lsvMainVertical); 
>     } 
>
>     private class LinkedScrollView extends ScrollView 
>     { 
>       public boolean cascadeScroll = true; 
>       public ArrayList<LinkedScrollView> others = new 
> ArrayList<LinkedScrollView>(); 
>
>       public LinkedScrollView(Context context) 
>       { 
>         super(context); 
>       } 
>
>       @Override 
>       protected void onScrollChanged(int l, int t, int oldl, int oldt) 
>       { 
>         super.onScrollChanged(l, t, oldl, oldt); 
>
>         if(cascadeScroll) 
>         { 
>           for(int i = 0; i < others.size(); i++) 
>           { 
>             others.get(i).cascadeScroll = false; 
>             others.get(i).scrollTo(l, t); 
>             others.get(i).cascadeScroll = true; 
>           } 
>         } 
>       } 
>     } 
> } 
>
> On Aug 31, 5:20 am, Bret Foreman <[email protected]> wrote: 
> > I don't think the memory load will be as bad as you imagine. I plan to 
> > give the user a pick-list of which columns they want to see in the 
> > table. In practice, they will rarely choose more than a handful. 
> > Likewise, there are rarely more than a few dozen rows. So total memory 
> > footprint is <o>200Kbytes. 
> > 
> > For now I'll just use a GridView and continue to think about my 
> > options. 
> > 
> > IMHO, this is a pretty glaring omission from the GridView 
> > functionality, since 9 times out of 10 people need to understand their 
> > orientation in the grid - what rows and columns they are viewing. 
> > 
> > On Aug 30, 10:58 am, Mark Murphy <[email protected]> wrote: 
> > 
> > 
> > 
> > > On Mon, Aug 30, 2010 at 1:48 PM, Bret 
> Foremanbegin_of_the_skype_highlighting     end_of_the_skype_highlighting<
> [email protected]> wrote: 
> > > > What do you think about the difficulty of synchronizing the 
> scrolling 
> > > > of the ListViews? 
> > 
> > > I think it will be difficult. I also think your solution will be 
> > > memory-intensive for large numbers of columns. 
> > 
> > > The "right" answer is for this to be implemented at a lower level, 
> > > perhaps using the code from GridView as a basis. What you really want 
> > > is a GridView that supports horizontal scrolling (up to a stated 
> > > number of columns) and pinning of certain rows/columns. Done properly, 
> > > the memory consumption would be limited to the visible cells -- your 
> > > HorizontalScrollView-of-ListViews will require memory proportional to 
> > > the total number of columns, not just the visible columns. 
> > 
> > > However, to paraphrase Thomas Hobbes, any solution for this will be 
> > > nasty, brutish, and long. GridView is ~2,000 lines of code, and you 
> > > want a superset of GridView capabilities. 
> > 
> > > -- 
> > > Mark Murphy (a Commons Guy)http://commonsware.com|
> http://github.com/commonsguyhttp://commonsware.com/blog|http://twitter.com/commonsguy
>  
> > 
> > > _The Busy Coder's Guide to *Advanced* Android Development_ Version 1.9 
> > > Available!

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to