ListView的横向滚动(带表头与固定列)

问题背景:在做图表展示的时候,ListView可以上下左右滑动,但最左边一列在向右滑动时,保持不变,表头在向下滑动时保持不变。

有用两个ListView实现的,但测试过,好像有些问题

这个例子是通过(ListView + HorizontalScrollView)实现的

效果图:

 

 

/**
 * 
 * 带滑动表头与固定列的ListView
 */
public class HListActivity extends Activity{
	 private ListView mListView;
	 //方便测试,直接写的public 
	 public HorizontalScrollView mTouchView;
	 //装入所有的HScrollView
	 protected List<CHScrollView> mHScrollViews =new ArrayList<CHScrollView>();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.scroll);
		initViews();
	}
	
	private void initViews() {
		List<Map<String, String>> datas = new ArrayList<Map<String,String>>();
		Map<String, String> data = null;
		CHScrollView headerScroll = (CHScrollView) findViewById(R.id.item_scroll_title);
		//添加头滑动事件 
		mHScrollViews.add(headerScroll);
		mListView = (ListView) findViewById(R.id.scroll_list);
		for(int i = 0; i < 100; i++) {
			data = new HashMap<String, String>();
			data.put("title", "Title_" + i);
			data.put("data_" + 1, "Date_" + 1 + "_" +i );
			data.put("data_" + 2, "Date_" + 2 + "_" +i );
			data.put("data_" + 3, "Date_" + 3 + "_" +i );
			data.put("data_" + 4, "Date_" + 4 + "_" +i );
			data.put("data_" + 5, "Date_" + 5 + "_" +i );
			data.put("data_" + 6, "Date_" + 6 + "_" +i );
			datas.add(data);
		}
		SimpleAdapter adapter = new ScrollAdapter(this, datas, R.layout.item
							, new String[] { "title", "data_1", "data_2", "data_3", "data_4", "data_5", "data_6", }
							, new int[] { R.id.item_title 
										, R.id.item_data1
										, R.id.item_data2
										, R.id.item_data3
										, R.id.item_data4
										, R.id.item_data5
										, R.id.item_data6 });
		mListView.setAdapter(adapter);
	}
	
	public void addHViews(final CHScrollView hScrollView) {
		if(!mHScrollViews.isEmpty()) {
			int size = mHScrollViews.size();
			CHScrollView scrollView = mHScrollViews.get(size - 1);
			final int scrollX = scrollView.getScrollX();
			//第一次满屏后,向下滑动,有一条数据在开始时未加入
			if(scrollX != 0) {
				mListView.post(new Runnable() {
					@Override
					public void run() {
						//当listView刷新完成之后,把该条移动到最终位置
						hScrollView.scrollTo(scrollX, 0);
					}
				});
			}
		}
		mHScrollViews.add(hScrollView);
	}
	
	public void onScrollChanged(int l, int t, int oldl, int oldt){
		for(CHScrollView scrollView : mHScrollViews) {
			//防止重复滑动
			if(mTouchView != scrollView)
				scrollView.smoothScrollTo(l, t);
		}
	}
	
	class ScrollAdapter extends SimpleAdapter {

		private List<? extends Map<String, ?>> datas;
		private int res;
		private String[] from;
		private int[] to;
		private Context context;
		public ScrollAdapter(Context context,
				List<? extends Map<String, ?>> data, int resource,
				String[] from, int[] to) {
			super(context, data, resource, from, to);
			this.context = context;
			this.datas = data;
			this.res = resource;
			this.from = from;
			this.to = to;
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View v = convertView;
			if(v == null) {
				v = LayoutInflater.from(context).inflate(res, null);
				//第一次初始化的时候装进来
				addHViews((CHScrollView) v.findViewById(R.id.item_scroll));
				View[] views = new View[to.length];
				for(int i = 0; i < to.length; i++) {
					View tv = v.findViewById(to[i]);;
					tv.setOnClickListener(clickListener);
					views[i] = tv;
				}
				v.setTag(views);
			}
			View[] holders = (View[]) v.getTag();
			int len = holders.length;
			for(int i = 0 ; i < len; i++) {
				((TextView)holders[i]).setText(this.datas.get(position).get(from[i]).toString());
			}
			return v;
		}
	}
	
	//测试点击的事件 
	protected View.OnClickListener clickListener = new View.OnClickListener() {
		@Override
		public void onClick(View v) {
			Toast.makeText(HListActivity.this, ((TextView)v).getText(), Toast.LENGTH_SHORT).show();
		}
	};
}

 

/**
* 滑动代码
*/
public class CHScrollView extends HorizontalScrollView {
	
	HListActivity activity;
	
	public CHScrollView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		activity = (HListActivity) context;
	}

	
	public CHScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
		activity = (HListActivity) context;
	}

	public CHScrollView(Context context) {
		super(context);
		activity = (HListActivity) context;
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		//进行触摸赋值
		activity.mTouchView = this;
		return super.onTouchEvent(ev);
	}
	
	@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {
		//当当前的CHSCrollView被触摸时,滑动其它
		if(activity.mTouchView == this) {
			activity.onScrollChanged(l, t, oldl, oldt);
		}else{
			super.onScrollChanged(l, t, oldl, oldt);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值