android 带表头,左右两个联动的ListView

package com.rytong.mylist;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.TextView;

public class SuperTables extends Activity {

	public static final LayoutParams FULL = new LayoutParams(
			LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
	public static final LayoutParams DEFINDELP = new LayoutParams(100, 200);
	public static final LayoutParams TEXTLP = new LayoutParams(100, 50);
	public static final int TEXTSIZE = 20;
	private LinearLayout mainLly;
	private ListView leftLst;
	private LinearLayout leftLly;

	private HorizontalScrollView rightHsv;
	private LinearLayout rightLly;
	private ListView rightLst;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		mainLly = new LinearLayout(this);
		mainLly.setLayoutParams(FULL);
		mainLly.setOrientation(LinearLayout.HORIZONTAL);
		initLeft();
		initRight();
		setCascading();
		setContentView(mainLly);
	}

	private void initLeft() {
		leftLly = new LinearLayout(this);
		leftLly.setOrientation(LinearLayout.VERTICAL);
		leftLly.setLayoutParams(DEFINDELP);
		leftLst = new ListView(this);
		leftLst.setLayoutParams(FULL);
		// 添加ListView头部视图
		LinearLayout leftHead = new LinearLayout(this);
		// leftHead.setLayoutParams(TEXTLP);
		TextView tv = new TextView(this);
		tv.setText("title");
		tv.setTextSize(TEXTSIZE);
		tv.setLayoutParams(TEXTLP);
		leftHead.addView(tv);
		leftLly.addView(leftHead);
		// leftLst.addHeaderView(leftHead);
		leftLst.setAdapter(new LeftLstAdapter(this, new String[] { "0.0.0.0",
				"1.1.1.1", "2.2.2.2", "3.3.3.3", "4.4.4.4", "5.5.5.5",
				"6.6.6.6", "7.7.7.7", "8.8.8.8", "9.9.9.9" }));
		//leftLst.setScrollBarStyle();
		//leftLst.setScrollBarStyle(0);
		leftLst.setCacheColorHint(Color.TRANSPARENT);
		leftLst.setAlwaysDrawnWithCacheEnabled(true);
		//隐藏滚动条
		leftLst.setVerticalScrollBarEnabled(false);
		leftLly.addView(leftLst);
		leftLly.setBackgroundColor(Color.WHITE);
		mainLly.addView(leftLly);
		getWindow().getDecorView();
	}

	public class LeftLstAdapter extends BaseAdapter {
		private Context context_;
		private String[] data_;

		public LeftLstAdapter(Context context, String[] data) {
			// TODO Auto-generated constructor stub
			this.context_ = context;
			this.data_ = data;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return data_.length;
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return data_[position];
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			LinearLayout lly = new LinearLayout(context_);
			TextView tv = new TextView(context_);
			tv.setLayoutParams(TEXTLP);
			tv.setText(data_[position]);
			tv.setTextSize(TEXTSIZE);
			lly.addView(tv);
			return lly;
		}

	}

	public static final String[] TITLES = new String[] { "name", "sex", "age",
			"school", "salary", "spouse" };

	private void initRight() {
		rightHsv = new HorizontalScrollView(this);
		rightHsv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
				200));
		rightLly = new LinearLayout(this);
		rightLly.setOrientation(LinearLayout.VERTICAL);
		rightLly.setLayoutParams(FULL);
		// 右侧ListVie标题
		LinearLayout lly = new LinearLayout(this);
		lly.setLayoutParams(new LayoutParams(100 * TITLES.length, 50));
		lly.setOrientation(LinearLayout.HORIZONTAL);
		TextView t = null;
		LinearLayout ly = null;
		for (int i = 0; i < TITLES.length; i++) {
			ly = new LinearLayout(this);
			ly.setLayoutParams(TEXTLP);
			t = new TextView(this);
			t.setText(TITLES[i]);
			t.setTextSize(TEXTSIZE);
			ly.addView(t);
			// t.setLayoutParams(TEXTLP);
			lly.addView(ly);
		}
		rightLly.addView(lly);
		rightLst = new ListView(this);
		rightLst.setAdapter(new RightAdapter(this, getData()));
		rightLly.addView(rightLst);
		rightHsv.addView(rightLly);
		rightHsv.setPadding(20, 0, 0, 0);
		mainLly.addView(rightHsv);
	}

	// 设置联动
	private void setCascading() {
		rightLst.setOnTouchListener(new View.OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				leftLst.dispatchTouchEvent(event);
				return false;
			}
		});

		leftLst.setOnScrollListener(new AbsListView.OnScrollListener() {

			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				// TODO Auto-generated method stub
			}
			
			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				if (leftLst.getChildAt(0) != null) {
					Rect r = new Rect();
					leftLst.getChildVisibleRect(leftLst.getChildAt(0), r, null);
					rightLst.setSelectionFromTop(
							leftLst.getFirstVisiblePosition(), r.top);
				}

			}
		});

	}

	public List<HashMap<String, String>> getData() {
		List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
		HashMap<String, String> dataItem = null;
		Random rd = new Random();
		for (int i = 0; i < 9; i++) {
			dataItem = new HashMap<String, String>();
			for (int j = 0; j < TITLES.length; j++) {
				dataItem.put(TITLES[j],  i + "");//rd.nextInt(10000)
			}
			data.add(dataItem);
		}

		return data;
	}

	public class RightAdapter extends BaseAdapter {

		Context context_;
		List<HashMap<String, String>> data_;

		public RightAdapter(Context context, List<HashMap<String, String>> data) {
			// TODO Auto-generated constructor stub
			this.context_ = context;
			this.data_ = data;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return data_.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return data_.get(position);
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			LinearLayout lly = new LinearLayout(context_);
			lly.setOrientation(LinearLayout.HORIZONTAL);
			TextView tv = null;
			for (int i = 0, size = data_.get(position).size(); i < size; i++) {
				tv = new TextView(context_);
				tv.setLayoutParams(TEXTLP);
				tv.setText(data_.get(position).get(TITLES[i]));
				tv.setTextSize(TEXTSIZE);
				lly.addView(tv);
			}
			return lly;
		}

	}

}

源码地址: http://download.csdn.net/download/libei_march/4597030

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值