前段时间做个项目,要用到一个横向滑动的表格,顺手百度了一下,看到一位哥们的思路挺不错(http://www.javaapk.com/source/4374.html),参考了一下其中的思路,进行了一定的封装和优化。
封装后还没进行过较为详细的测试,如果遇见有bug或者有优化的建议的话,可随时联系我。
其实整个横竖表格的原理实现,竖向的滑动的话,就是listview的滑动,横向的话,则在listview的item里面利用HorizontalScrollView实现横向滑动,然后加以控制,当某一个item里的HorizontalScrollView发生横向滑动的时候,就把所有的item里的HorizontalScrollView也滑动到对应的位置。
我把这个listview和标题行封装到了一个LinearLayout中,封装成了VHTableView。
先看一下怎么用
布局xml如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<com.demo.zj.vhtableview.VHTableView
android:id="@+id/vht_table"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</com.demo.zj.vhtableview.VHTableView>
</RelativeLayout>
布局文件很简单,就这个自定义的view。
接着在activity里的调用,也很简单
<span style="white-space:pre"> </span>VHTableView vht_table=(VHTableView)findViewById(R.id.vht_table);
<span style="white-space:pre"> </span>VHTableAdapter tableAdapter=new VHTableAdapter(this,titleData,contentData);//titleData,contentData这两个数据源自己设置..
//vht_table.setFirstColumnIsMove(true);//设置第一列是否可移动,默认不可移动
//vht_table.setShowTitle(false);//设置是否显示标题行,默认显示
vht_table.setAdapter(tableAdapter);
里面的VHtableAdapter是实现了VHBaseAdapter接口的类,接着来看VHBaseAdapter接口
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public interface VHBaseAdapter {
//表格内容的行数,不包括标题行
public int getContentRows() ;
//列数
public int getContentColumn();
//标题的view,这里从0开始,这里要注意,一定要有view返回去,不能为null,每一行
// 各列的宽度就等于标题行的列的宽度,且边框的话,自己在这里和下文的表格单元格view里面设置
public View getTitleView(int columnPosition, ViewGroup parent);
//表格正文的view,行和列都从0开始,宽度的话在载入的时候,默认会是以标题行各列的宽度,高度的话自适应
public View getTableCellView(int contentRow, int contentColum, View view, ViewGroup parent);
public Object getItem(int contentRow) ;
//每一行被点击的时候的回调
public void OnClickContentRowItem(int row, View convertView);
}
接下来看
VHTableView的具体实现,具体代码如下:
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;