`
yq135314
  • 浏览: 255472 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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);
		}
	}
}
分享到:
评论
11 楼 aduovip 2018-08-23  


博主, 这样做,列表还能通过下拉刷新,上拉加载 实现分页吗
10 楼 aduovip 2018-08-19  
赞,谢谢博主分享!  
9 楼 eddya 2016-07-21  
超赞,谢谢分享!
8 楼 cyt1030 2016-03-17  
如果在表格的头部 加上添加一个按钮 在点击按钮时动态添加的views集合到item中 如何控制 这个view的 size 望楼主指点
7 楼 qingfeng812 2014-08-12  
布局配置文件都不能显示,有错误;不是好的解决方案!
6 楼 qkdyzwp 2014-07-17  
哥们说一下思路啊你的源码被人家篡改了一下载就是视频,你里面的几个id好乱啊,都不知道你是怎么嵌套的
5 楼 guanting207 2014-03-07  
点击如何获取当前的行列啊 我settag position 错乱了,楼主快快现身解解惑
4 楼 xlbeijing2008 2014-02-26  
能把完整的源码发到我QQ:178530945@qq.com邮箱吗?谢谢了!
3 楼 xlbeijing2008 2014-02-26  
就是啊,楼主,ListView的item点击没反应!怎么实现呢?
2 楼 wystyle1 2013-11-06  
谢谢你分享代码,我在项目中用到了你的代码,但是有两个问题:
1、当把表头向左滑动一些,在向下滑动ListView你会发现,表格有时会错乱,就是上下不对齐。
2、你的表格中每个具体数据可以点击。但是将表格的一行无法响应点击事件,即ListView的item点击没反应!
求楼主给我指导指导!谢谢!
1 楼 沐子雨 2013-10-11  
学习了~

相关推荐

    android的ListView下拉刷新上拉加载和列表头横向滚动(带表头与固定列)

    android的ListView上拉刷新下拉加载和列表头横向滚动(带表头与固定列)。 该demo是我结合网上的两个示例一个是上下拉刷新加载的ListView,一个是横向滚动带固定列和列表头.主要是自定义了两个控件(重写)ListView和...

    Android程序开发之ListView实现横向滚动(带表头与固定列)

    标题所提到的"Android程序开发之ListView实现横向滚动(带表头与固定列)"是针对这种需求的一个解决方案,即在ListView中实现横向滚动,同时保持左侧列(通常是表头)固定,顶部表头在向下滚动时也始终保持可见。...

    gridview固定表头 横向滚动 纵向固定

    "GridView固定表头横向滚动纵向固定" GridView是一个基于ASP.NET的数据控件,用于显示数据表格。然而,在默认情况下,GridView的表头无法固定在屏幕上,使得用户体验不佳。为了解决这个问题,本文将介绍如何实现...

    gridview固定表头的一个具体实例----横向滚动 纵向滚动

    ### GridView固定表头实现——横向滚动与纵向固定 在网页应用开发中,特别是涉及到大量数据展示的情况下,如何优雅地处理表格中的数据展示成为一个重要的技术挑战。本文将通过一个具体的实例来探讨如何实现在使用...

    安卓下拉上拉刷新相关-android的ListView下拉刷新上拉加载和列表头横向滚动(带表头与固定列).rar

    此外,对于带表头与固定列的需求,可能需要利用GridView或者TableLayout来实现。固定列通常意味着在列表的左侧或上方有一列始终保持显示,即使用户滚动列表,这部分也不会移动。这需要自定义布局和视图管理,确保...

    ListView表头和第一列不动上下左右滑动

    总之,实现"ListView表头和第一列固定不动上下左右滑动"的功能需要对Android布局管理、滚动事件处理以及性能优化有深入理解。通过自定义组件、使用第三方库或者结合现有组件,都可以达到预期效果。在实际开发中,应...

    android开发之横向滚动/竖向滚动的ListView(固定列头)

    在Android开发中,有时我们需要创建一个既可横向滚动又可竖向滚动的表格,这通常涉及到自定义ListView和HorizontalScrollView的组合使用。以下是对这个特殊需求的详细解释和实现思路: 首先,我们用ListView来处理...

    固定列头表头ListScroll

    【固定列头表头ListScroll】是一种在Android开发中实现的高级UI组件,它结合了ListView和ScrollView的优点,主要用于展示大量数据并具有横向滚动和纵向滚动功能的表格。这种组件通常用于显示复杂的数据结构,例如...

    Android开发ListView中下拉刷新上拉加载及带列的横向滚动实现方法

    在示例中提到的ListView横向滚动示例,可能涉及到设置横向滚动的滚动方向,以及处理表头和固定列的问题。表头通常需要独立处理,保持在屏幕顶部固定,而列则需要在水平方向上滑动。这通常需要自定义Adapter和布局来...

    listview的上下左右滑动

    总之,实现一个支持上下左右滑动并带有固定表头的ListView需要对Android的触摸事件处理、自定义View和Adapter有深入理解。通过这样的定制,我们可以为用户带来更丰富的交互体验,提高应用的可用性和吸引力。

    可上下左右滑动的listview

    在上下滑动ListView时,为了保持用户体验的一致性,通常会有一个列表头(Header)显示在最上方,固定不动。这可以通过在ListView中添加一个HeaderView来实现。在Android中,可以通过`addHeaderView()`方法将自定义...

    可以左右滑动的ListView

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。然而,标准的ListView只能上下滚动,但有时候我们可能需要实现一个可以左右滑动的ListView,这通常是通过自定义适配器和布局管理器来实现的...

    双表头表格

    至于标签中的"android", "双表头", "表格", "listview", "横向滑动",这些关键词都与实现双表头表格的关键技术相关。Android是开发平台,双表头和表格是指我们要构建的界面元素,ListView是核心组件,而横向滑动是...

    安卓横向滑动表格 可以多选

    在这里,我们可以将表头放入`HorizontalScrollView`中,使得用户可以左右滑动查看所有列标题。 3. **多选机制**: 多选功能通常需要配合`CheckBox`来实现。在每个列表项中添加一个复选框,用户可以通过点击来选择...

    轮播图,gridview,筛选listview

    GridView允许我们将数据以行和列的形式组织起来,用户可以通过横向和纵向滑动来查看更多的内容。在Android中,我们可以使用GridView控件来实现,通过Adapter类填充数据,并设置相应的布局参数来调整网格的列数和间距...

    《程序天下:JavaScript实例自学手册》光盘源码

    17.9 为textarea加横向滚动条 17.10 记录滚动条位置 17.11 彩色滚动条 17.12 Windows XP的滚动条 第18章 在线考题案例 18.1 在线考试代码 18.2 在线考试代码(二) 18.3 在线测试代码(三) 18.4 多选考试题 18.5 ...

    程序天下:JavaScript实例自学手册

    17.9 为textarea加横向滚动条 17.10 记录滚动条位置 17.11 彩色滚动条 17.12 Windows XP的滚动条 第18章 在线考题案例 18.1 在线考试代码 18.2 在线考试代码(二) 18.3 在线测试代码(三) 18.4 多选考试题 18.5 ...

Global site tag (gtag.js) - Google Analytics