1、自定义实现一个水平滚动控件HorizontalScrollView

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.HorizontalScrollView; /**
* Created by StephenHe on 2016/8/4.
* 实现两个HorizontalScrollView同步滚动
*/ public class SyncHorizontalScrollView extends HorizontalScrollView {
private View mView; public SyncHorizontalScrollView(Context context) {
super(context);
} public SyncHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
} public SyncHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mView != null) {
mView.scrollTo(l, t);
}
} public void setScrollView(View view) {
mView = view;
}
}

2、自定义实现ListView让其能跟着ScrollView滚动

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView; public class NoscrollListView extends ListView { public NoscrollListView(Context context) {
super(context);
} public NoscrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
} public NoscrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}

3、ListView的每一项布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <LinearLayout
android:id="@+id/lin_content"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"> <TextView
android:id="@+id/tv_data"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text="1"/> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/> <TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text="2"/> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/> <TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text="3"/> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/> <TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text="4"/> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/> <TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text="5"/> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/>
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical"> <TextView
android:id="@+id/tv_left"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:text="第1行"/>
</LinearLayout>
</LinearLayout>

4、主Activity布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"> <LinearLayout
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:orientation="vertical"></LinearLayout> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/> <LinearLayout
android:id="@+id/lin_header_content"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="3"
android:orientation="vertical"> <com.exceldemo.SyncHorizontalScrollView
android:id="@+id/header_horizontal"
android:layout_width="match_parent"
android:layout_height="50dp"
android:overScrollMode="never"
android:scrollbars="none"> <LinearLayout
android:id="@+id/lin_year_title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"> <TextView
android:id="@+id/tv_data"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text="第1列数据"/> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/> <TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text="第2列数据"/> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/> <TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text="第3列数据"/> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/> <TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text="第4列数据"/> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/> <TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:gravity="center"
android:text="第5列数据"/> <View
android:layout_width="1px"
android:layout_height="50dp"
android:background="#cccccc"/>
</LinearLayout>
</com.exceldemo.SyncHorizontalScrollView>
</LinearLayout>
</LinearLayout> <View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#cccccc"/> <ScrollView
android:id="@+id/scroll_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:scrollbars="none"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:orientation="horizontal"> <com.exceldemo.NoscrollListView
android:id="@+id/lv_left"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:overScrollMode="never"
android:scrollbars="none"/> <View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="#cccccc"/> <LinearLayout
android:id="@+id/lin_data_content"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:orientation="vertical"> <com.exceldemo.SyncHorizontalScrollView
android:id="@+id/data_horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:scrollbars="none"> <com.exceldemo.NoscrollListView
android:id="@+id/lv_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:scrollbars="none"/>
</com.exceldemo.SyncHorizontalScrollView>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>

5、主Activity代码

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity { private NoscrollListView mLeft;
private LeftAdapter mLeftAdapter; private NoscrollListView mData;
private DataAdapter mDataAdapter; private SyncHorizontalScrollView mHeaderHorizontal;
private SyncHorizontalScrollView mDataHorizontal; private List<String> mListData; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView();
} private void initView(){
mLeft = (NoscrollListView) findViewById(R.id.lv_left);
mData = (NoscrollListView) findViewById(R.id.lv_data);
mDataHorizontal = (SyncHorizontalScrollView) findViewById(R.id.data_horizontal);
mHeaderHorizontal = (SyncHorizontalScrollView) findViewById(R.id.header_horizontal); mDataHorizontal.setScrollView(mHeaderHorizontal);
mHeaderHorizontal.setScrollView(mDataHorizontal); mListData = new ArrayList<>();
mListData.add("1");
mListData.add("2");
mListData.add("3");
mListData.add("4");
mListData.add("5");
mListData.add("6");
mListData.add("7");
mListData.add("8");
mListData.add("9");
mListData.add("10");
mListData.add("11");
mListData.add("12");
mListData.add("13"); mLeftAdapter= new LeftAdapter();
mLeft.setAdapter(mLeftAdapter); mDataAdapter = new DataAdapter();
mData.setAdapter(mDataAdapter);
} class LeftAdapter extends BaseAdapter { @Override
public int getCount() {
return mListData.size();
} @Override
public Object getItem(int position) {
return mListData.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_left, null);
holder.tvLeft = (TextView) convertView.findViewById(R.id.tv_left);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
} holder.tvLeft.setText("第" + position + "行"); return convertView;
} class ViewHolder {
TextView tvLeft;
}
} class DataAdapter extends BaseAdapter { @Override
public int getCount() {
return mListData.size();
} @Override
public Object getItem(int position) {
return mListData.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
holder = new ViewHolder();
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_data, null);
holder.tvData = (TextView) convertView.findViewById(R.id.tv_data);
holder.linContent = (LinearLayout) convertView.findViewById(R.id.lin_content);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
} return convertView;
} class ViewHolder {
TextView tvData;
LinearLayout linContent;
}
}
}

6、效果图,实现左侧表头能上下滑动,上面表头能左右滑动,数据部分能左右上下滑动.

Android实现Excel表格,且表格能左右、上下滑动的更多相关文章

  1. [excel玩转表格教程][1G][AVI]

    [excel玩转表格教程][1G][AVI] 下载地址 :http://www.fu83.cn/thread-222-1-1.html

  2. excel技巧--复制带excel侧边的表格

    假设要复制出带excel侧边的表格内容,则使用以下步骤: 1.选择要复制的表格: 2.选择“页面布局”->“标题”选项的“打印”打勾: 3.选择“开始”->复制旁的三角选项:复制为图片: ...

  3. Asp.net C# 遍历Excel中的表格名称

    Asp.net C# 遍历Excel中的表格名称     string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + " ...

  4. 二、制作BOM表格--物料表格--Bill of Materials

    二.制作BOM表格--物料表格--Bill of Materials 公司会根据这个表格进行相关元器件的采购--以及后期的贴片上彩 操作: .dsn--Tools--Bill of Materials ...

  5. SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学、字符串、日期时间)函数[转]

    SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学.字符串.日期时间)函数   --创建表格 create table aa ( UserName varchar(50 ...

  6. 【最后的冲刺】android中excel表的导入和数据处理

    [最后的冲刺]android中excel表的导入和数据处理 ——学校课程的查询和修改 1.编写 The Class类把课程表courses.db当做一个实体类,hashcode和equals这两个类是 ...

  7. element-ui中的表格嵌套表格

    element-ui中有详细的各种表格及表格方法.也有表格展开出现二级的样式,但是却没有表格嵌套二级表格的方案,于是就自己写了一个,样式图如下: 展开后如下 这就是一个普通的二级表格嵌套,用的是el- ...

  8. Android ListView实现单击item出现删除按钮以及滑动出现删除按钮

    我自己一个人弄的公司的产品客户端,所以还是想记录下来以免忘记或者丢失... 在我的上一篇博文(点击打开链接)是一个文件管理的东西,基础组件也是ListView所以在此只是改动一下而已. 单击: 点击出 ...

  9. Html报表用Excel打开保持表格线【Html报表模板】

    注:本人调试的最简版,前两处红色部分是为了输出Excel表格线:x:str表示输出为文本样式,避免被输出为科学计数法. <!DOCTYPE html PUBLIC "-//W3C//D ...

随机推荐

  1. python2到python3的转换以及f.write在python3 中的用法

    .利用Python内置(Python脚本)工具,帮你自动转换 Python 2.x版本,比如我安装的Python 2.7.2,其在windows下载安装好之后,就自带了相关的一些有用的工具. 其中一个 ...

  2. Intellij IDEA下导出Java工程的可运行JAR包

    Intellij IDEA下导出Java工程的可运行JAR包 昨天一直向导出一个Java工程的可运行JAR包,然后查阅网上的资料以及自己一遍一遍的尝试,均以失败告终.可以导出JAR包,但是导出的JAR ...

  3. C/C++中整数与浮点数在内存中的表示方式

    在C/C++中数字类型主要有整数与浮点数两种类型,在32位机器中整型占4字节,浮点数分为float,double两种类型,其中float占4字节,而double占8字节.下面来说明它们在内存中的具体表 ...

  4. 用PHP提取MYSQL二进制日志的SQL语句

    上一篇说道,在从日志提取出SQL语句的时候,碰到了一句SQL跨了N行无法提取.后来在网上搜了两句shell: sed -n '/^INSERT /,/;/p' log.sql > log_ins ...

  5. STM32笔记总结

    1.命名规则 2.#pragma pack使用 #pragma pack 1保证字节对齐 置结构体的边界对齐为1个字节,也就是所有数据在内存中是连续存储的struct s{    char ch;   ...

  6. Facebook 添加点赞按钮

    本来以为facebook文档里面会有那么一个简单的API,请求之后就可以对指定的页面点赞.但可能是出于防作弊方面的考虑,facebook只提供了自己官方的按钮 https://developers.f ...

  7. c# delegate的invoke和bejinInvoke的区别

    先看下面实实例代码 private delegate void testdg(); private void button1_Click(object sender, EventArgs e)     ...

  8. MongoDB数据库基本操作

    一.使用数据库 显示所有数据库命令 $ ./mongo MongoDB shell version: connecting to: test > show dbs local .078GB te ...

  9. 2015 Multi-University Training Contest 6

    1001 Average 忍不住又补了一题. 只要枚举1与2之间1给2,2给1,什么都不做三种状态. 后面的情况都已经决定了. (估计只有我比赛的时候把a candy当成a个糖果了吧QAQ) # in ...

  10. Mac 下office 2013制作组合表

    1.选择所有数据,插入图表→柱状图.2.选中柱状图中得某一数据,如栏目量.这个在柱状图上单击一次橙色柱子就能全部选中.3.更改图表类型,改为饼状图,再单击饼状图改为折线图.