Android中实现Spreadsheet


Android中要实现类似excel一样的spreadsheet,一般的思路是想到重写ListView控件,但经过尝试以后发现挺复杂的。想到TableLayout也有无限扩展的功能,就尝试用TableLayout来实现。TableLayout自身是不能滑动的,一般都是和ScrollView一起使用。横向的滑动则使用HorizontalScrollView来实现。 经过这三个组件的搭配,就轻松的实现了spreadsheet。

源代码:

  1. package com.SpreadSheet;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.os.Bundle;  
  8. import android.widget.HorizontalScrollView;  
  9. import android.widget.LinearLayout;  
  10. import android.widget.ScrollView;  
  11. import android.widget.TableLayout;  
  12. import android.widget.TableRow;  
  13. import android.widget.TextView;  
  14.   
  15. public class test extends Activity {  
  16.     /** Called when the activity is first created. */  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.spreadsheet);  
  21.         final int NUM_COLS_AND_ROWS = 30;   
  22.         String[] cols = new String[NUM_COLS_AND_ROWS];  
  23.         String[] rows = new String[NUM_COLS_AND_ROWS];  
  24.       
  25.         LinearLayout layout = (LinearLayout) findViewById(R.id.layout_spreadsheet);  
  26.         // setup left column with row labels   
  27.         LinkedScrollView lsvLeftCol = new LinkedScrollView(this);  
  28.         lsvLeftCol.setVerticalScrollBarEnabled(false);   
  29.         TableLayout tlLeftCol = new TableLayout(this);  
  30.         TableLayout.LayoutParams tlLeftColParams = new TableLayout.LayoutParams();  
  31.         tlLeftCol.setLayoutParams(tlLeftColParams);  
  32.         for (int i = -1; i < rows.length; i++) {  
  33.             TableRow tr = new TableRow(this);  
  34.             TextView tv = new TextView(this);  
  35.             tv.setBackgroundResource(R.drawable.spreadsheetbg);  
  36.             if (i >= 0// -1 is the blank top left cell - this should really be   
  37.                         // outside the scroll to look right   
  38.             {  
  39.                 tv.setText(rows[i]);  
  40.             }  
  41.             tr.addView(tv);  
  42.             tlLeftCol.addView(tr);  
  43.         }  
  44.         lsvLeftCol.addView(tlLeftCol);  
  45.         // add the main horizontal scroll   
  46.         HorizontalScrollView hsvMainContent = new HorizontalScrollView(this);  
  47.         hsvMainContent.setHorizontalScrollBarEnabled(false);  
  48.         LinearLayout llMainContent = new LinearLayout(this);   
  49.         llMainContent.setOrientation(LinearLayout.VERTICAL);  
  50.         // add the headings   
  51.         TableLayout tlColHeadings = new TableLayout(this);  
  52.         TableRow trHeading = new TableRow(this);  
  53.         for (int i = 0; i < cols.length; i++) {  
  54.             TextView tv = new TextView(this);  
  55.             tv.setBackgroundResource(R.drawable.spreadsheetbg);  
  56.             tv.setText(cols[i]);  
  57.             trHeading.addView(tv);  
  58.         }  
  59.         tlColHeadings.addView(trHeading);  
  60.         llMainContent.addView(tlColHeadings);  
  61.         // now lets add the main content   
  62.         LinkedScrollView lsvMainVertical = new LinkedScrollView(this);  
  63.         lsvMainVertical.setVerticalScrollBarEnabled(false);   
  64.         TableLayout tlMainContent = new TableLayout(this);  
  65.         for (int i = 0; i < rows.length; i++) {  
  66.             TableRow tr = new TableRow(this);  
  67.             for (int j = 0; j < cols.length; j++) {  
  68.                 TextView tv = new TextView(this);  
  69.                 tv.setBackgroundResource(R.drawable.spreadsheetbg);  
  70.                 tv.setText("test");  
  71.                 tr.addView(tv);  
  72.             }  
  73.             tlMainContent.addView(tr);  
  74.         }  
  75.         lsvMainVertical.addView(tlMainContent);  
  76.         llMainContent.addView(lsvMainVertical);  
  77.         hsvMainContent.addView(llMainContent);  
  78.         layout.addView(lsvLeftCol);  
  79.         layout.addView(hsvMainContent);  
  80.           
  81.         lsvMainVertical.others.add(lsvLeftCol);  
  82.         lsvLeftCol.others.add(lsvMainVertical);  
  83.     }  
  84.   
  85.     private class LinkedScrollView extends ScrollView {  
  86.         public boolean cascadeScroll = true;  
  87.         public ArrayList<LinkedScrollView> others = new ArrayList<LinkedScrollView>();  
  88.   
  89.         public LinkedScrollView(Context context) {  
  90.             super(context);  
  91.         }  
  92.   
  93.         @Override  
  94.         protected void onScrollChanged(int l, int t, int oldl, int oldt) {  
  95.             super.onScrollChanged(l, t, oldl, oldt);  
  96.             if (cascadeScroll) {  
  97.                 for (int i = 0; i < others.size(); i++) {  
  98.                     others.get(i).cascadeScroll = false;  
  99.                     others.get(i).scrollTo(l, t);  
  100.                     others.get(i).cascadeScroll = true;  
  101.                 }  
  102.             }  
  103.         }  
  104.     }  
  105. }  

xml:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/layout_spreadsheet"></LinearLayout>  

相关内容