一看也许会觉得很困难,上手之后逻辑还是很简单的。
1.首先上下滚动通过scrollview实现控制左右两侧同时滚动,右侧listview通过重写HorizontalScrollView实现右侧的标题部分跟内容能够同时联动
下面是布局文件
<?
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
=
"wrap_content"
android:orientation
=
"horizontal"
>
<!-- 左侧标题的父容器 -->
<
LinearLayout
android:id
=
"@+id/left_title_container"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:layout_weight
=
"3"
android:orientation
=
"vertical"
>
<
include
layout
=
"@layout/layout_left_title"
/>
</
LinearLayout
>
<!-- 右侧标题的父容器可实现水平滚动 -->
<
com.thea.guo.leftrightscrool.view.SyncHorizontalScrollView
android:id
=
"@+id/title_horsv"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:layout_weight
=
"1"
android:scrollbars
=
"@null"
>
<
LinearLayout
android:id
=
"@+id/right_title_container"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:orientation
=
"horizontal"
>
<
include
layout
=
"@layout/layout_right_tab"
/>
</
LinearLayout
>
</
com.thea.guo.leftrightscrool.view.SyncHorizontalScrollView
>
</
LinearLayout
>
<!-- 此部分是内容部分 用ScrollView实现上下滚动效果 -->
<
ScrollView
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
>
<
LinearLayout
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
>
<!-- 左侧内容的父容器 -->
<
LinearLayout
android:id
=
"@+id/left_container"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:layout_weight
=
"3"
android:gravity
=
"center_vertical"
android:orientation
=
"vertical"
>
<
ListView
android:id
=
"@+id/left_container_listview"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
>
</
ListView
>
</
LinearLayout
>
<!-- 右侧内容的父容器 实现水平滚动 -->
<
com.thea.guo.leftrightscrool.view.SyncHorizontalScrollView
android:id
=
"@+id/content_horsv"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:layout_weight
=
"1"
android:scrollbars
=
"@null"
>
<
LinearLayout
android:id
=
"@+id/right_container"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:gravity
=
"center_vertical"
android:orientation
=
"horizontal"
>
<
ListView
android:id
=
"@+id/right_container_listview"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
>
</
ListView
>
</
LinearLayout
>
</
com.thea.guo.leftrightscrool.view.SyncHorizontalScrollView
>
</
LinearLayout
>
</
ScrollView
>
</
LinearLayout
>
2.其中SyncHorizontalScrollView 就是重写的那个实现联动的HorizontalScrollView
package com.thea.guo.leftrightscrool.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.HorizontalScrollView;
/**
* @Description:这个类也是从网上找的参考
*/
public class SyncHorizontalScrollView extends HorizontalScrollView {
private View mView;
public SyncHorizontalScrollView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public SyncHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
//设置控件滚动监听,得到滚动的距离,然后让传进来的view也设置相同的滚动具体
if(mView!=null) {
mView.scrollTo(l, t);
}
}
/**
* 设置跟它联动的view
* @param view
*/
public void setScrollView(View view) {
mView = view;
}
}
3.最后就是Activity的逻辑处理
package com.thea.guo.leftrightscrool;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.ListView;
import com.thea.guo.leftrightscrool.adapter.MyLeftAdapter;
import com.thea.guo.leftrightscrool.adapter.MyRightAdapter;
import com.thea.guo.leftrightscrool.model.RightModel;
import com.thea.guo.leftrightscrool.tool.UtilTools;
import com.thea.guo.leftrightscrool.view.SyncHorizontalScrollView;
import java.util.ArrayList;
import java.util.List;
public class TableActivity extends Activity {
private LinearLayout leftContainerView;
private ListView leftListView;
private List<
String
> leftlList;
private LinearLayout rightContainerView;
private ListView rightListView;
private List<
RightModel
> models;
private SyncHorizontalScrollView titleHorsv;
private SyncHorizontalScrollView contentHorsv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_tab_view);
leftContainerView = (LinearLayout) findViewById(R.id.left_container);
leftListView = (ListView) findViewById(R.id.left_container_listview);
rightContainerView = (LinearLayout) findViewById(R.id.right_container);
rightListView = (ListView) findViewById(R.id.right_container_listview);
titleHorsv = (SyncHorizontalScrollView) findViewById(R.id.title_horsv);
contentHorsv = (SyncHorizontalScrollView) findViewById(R.id.content_horsv);
// 设置两个水平控件的联动
titleHorsv.setScrollView(contentHorsv);
contentHorsv.setScrollView(titleHorsv);
// 左
leftContainerView.setBackgroundColor(Color.YELLOW);
initLeftData();
MyLeftAdapter adapter=new MyLeftAdapter(this, leftlList);
leftListView.setAdapter(adapter);
//控制高度
UtilTools.setListViewHeightBasedOnChildren(leftListView);
// 右
rightContainerView.setBackgroundColor(Color.GRAY);
initRightData();
MyRightAdapter myRightAdapter=new MyRightAdapter(this, models);
rightListView.setAdapter(myRightAdapter);
//控制高度
UtilTools.setListViewHeightBasedOnChildren(rightListView);
}
private void initRightData() {
models=new ArrayList<
RightModel
>();
for(int i=0;i<
30
;i++){
models.add(new RightModel(i+"_0",i+"_1",i+"_2",i+"_3",i+"_4",i+"_5",i+"_6"));
}
}
private void initLeftData() {
leftlList
=
new
ArrayList<String>();
for(int i=0;i<30;i++){
leftlList.add("Y_"+i);
}
}
}