[android-developers] Re: Scrolling like a spreadsheet
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
[android-developers] Re: Scrolling like a spreadsheet
What if I set up LinearLayout arranged horizontally with a set of ListViews? The left-most ListView would be a list of row labels. The whole works would be in a HorizontalScrollView. The column headings would be set with ListView.addHeader. Then the only difficult task would be synchronizing the scrolling of the ListViews. I'm guessing that somewhere in the ListView object hierarchy is something like onScrollListener that I can override and also something like setScroll. What do you think? -- You received this message because you are subscribed to the Google Groups Android Developers group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en
Re: [android-developers] Re: Scrolling like a spreadsheet
On Mon, Aug 30, 2010 at 12:44 PM, Bret Foreman bret.fore...@gmail.com wrote: What if I set up LinearLayout arranged horizontally with a set of ListViews? The left-most ListView would be a list of row labels. The whole works would be in a HorizontalScrollView. The column headings would be set with ListView.addHeader. Then the only difficult task would be synchronizing the scrolling of the ListViews. I'm guessing that somewhere in the ListView object hierarchy is something like onScrollListener that I can override and also something like setScroll. What do you think? I am uncertain that ListViews can go in a HorizontalScrollView, though it is worth a try. -- Mark Murphy (a Commons Guy) http://commonsware.com | http://github.com/commonsguy http://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 android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en
[android-developers] Re: Scrolling like a spreadsheet
What do you think about the difficulty of synchronizing the scrolling of the ListViews? On Aug 30, 10:21 am, Mark Murphy mmur...@commonsware.com wrote: I am uncertain that ListViews can go in a HorizontalScrollView, though it is worth a try. -- 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 android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en
Re: [android-developers] Re: Scrolling like a spreadsheet
On Mon, Aug 30, 2010 at 1:48 PM, Bret Foreman bret.fore...@gmail.com 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/commonsguy http://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 android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en
[android-developers] Re: Scrolling like a spreadsheet
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 o200Kbytes. 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 mmur...@commonsware.com wrote: On Mon, Aug 30, 2010 at 1:48 PM, Bret Foremanbegin_of_the_skype_highlighting end_of_the_skype_highlightingbret.fore...@gmail.com 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 android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en
[android-developers] Re: Scrolling like a spreadsheet
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 ArrayListLinkedScrollView others = new ArrayListLinkedScrollView(); public LinkedScrollView(Context context) { super(context); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt);