Android中实现Spreadsheet
Android中实现Spreadsheet
Android中要实现类似excel一样的spreadsheet,一般的思路是想到重写ListView控件,但经过尝试以后发现挺复杂的。想到TableLayout也有无限扩展的功能,就尝试用TableLayout来实现。TableLayout自身是不能滑动的,一般都是和ScrollView一起使用。横向的滑动则使用HorizontalScrollView来实现。 经过这三个组件的搭配,就轻松的实现了spreadsheet。
源代码:
- package com.SpreadSheet;
- 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 test extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.spreadsheet);
- final int NUM_COLS_AND_ROWS = 30;
- String[] cols = new String[NUM_COLS_AND_ROWS];
- String[] rows = new String[NUM_COLS_AND_ROWS];
- LinearLayout layout = (LinearLayout) findViewById(R.id.layout_spreadsheet);
- // setup left column with row labels
- LinkedScrollView lsvLeftCol = new LinkedScrollView(this);
- lsvLeftCol.setVerticalScrollBarEnabled(false);
- TableLayout tlLeftCol = new TableLayout(this);
- TableLayout.LayoutParams tlLeftColParams = new TableLayout.LayoutParams();
- tlLeftCol.setLayoutParams(tlLeftColParams);
- for (int i = -1; i < rows.length; i++) {
- TableRow tr = new TableRow(this);
- TextView tv = new TextView(this);
- tv.setBackgroundResource(R.drawable.spreadsheetbg);
- 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);
- tlLeftCol.addView(tr);
- }
- lsvLeftCol.addView(tlLeftCol);
- // add the main horizontal scroll
- HorizontalScrollView hsvMainContent = new HorizontalScrollView(this);
- hsvMainContent.setHorizontalScrollBarEnabled(false);
- LinearLayout llMainContent = new LinearLayout(this);
- llMainContent.setOrientation(LinearLayout.VERTICAL);
- // add the headings
- TableLayout tlColHeadings = new TableLayout(this);
- TableRow trHeading = new TableRow(this);
- for (int i = 0; i < cols.length; i++) {
- TextView tv = new TextView(this);
- tv.setBackgroundResource(R.drawable.spreadsheetbg);
- tv.setText(cols[i]);
- trHeading.addView(tv);
- }
- tlColHeadings.addView(trHeading);
- llMainContent.addView(tlColHeadings);
- // now lets add the main content
- LinkedScrollView lsvMainVertical = new LinkedScrollView(this);
- lsvMainVertical.setVerticalScrollBarEnabled(false);
- TableLayout tlMainContent = new TableLayout(this);
- for (int i = 0; i < rows.length; i++) {
- TableRow tr = new TableRow(this);
- for (int j = 0; j < cols.length; j++) {
- TextView tv = new TextView(this);
- tv.setBackgroundResource(R.drawable.spreadsheetbg);
- tv.setText("test");
- tr.addView(tv);
- }
- tlMainContent.addView(tr);
- }
- lsvMainVertical.addView(tlMainContent);
- llMainContent.addView(lsvMainVertical);
- hsvMainContent.addView(llMainContent);
- layout.addView(lsvLeftCol);
- layout.addView(hsvMainContent);
- 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;
- }
- }
- }
- }
- }
xml:
- <?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:id="@+id/layout_spreadsheet"></LinearLayout>
评论暂时关闭