问题背景:在做图表展示的时候,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); } } }
相关推荐
android的ListView上拉刷新下拉加载和列表头横向滚动(带表头与固定列)。 该demo是我结合网上的两个示例一个是上下拉刷新加载的ListView,一个是横向滚动带固定列和列表头.主要是自定义了两个控件(重写)ListView和...
标题所提到的"Android程序开发之ListView实现横向滚动(带表头与固定列)"是针对这种需求的一个解决方案,即在ListView中实现横向滚动,同时保持左侧列(通常是表头)固定,顶部表头在向下滚动时也始终保持可见。...
"GridView固定表头横向滚动纵向固定" GridView是一个基于ASP.NET的数据控件,用于显示数据表格。然而,在默认情况下,GridView的表头无法固定在屏幕上,使得用户体验不佳。为了解决这个问题,本文将介绍如何实现...
### GridView固定表头实现——横向滚动与纵向固定 在网页应用开发中,特别是涉及到大量数据展示的情况下,如何优雅地处理表格中的数据展示成为一个重要的技术挑战。本文将通过一个具体的实例来探讨如何实现在使用...
此外,对于带表头与固定列的需求,可能需要利用GridView或者TableLayout来实现。固定列通常意味着在列表的左侧或上方有一列始终保持显示,即使用户滚动列表,这部分也不会移动。这需要自定义布局和视图管理,确保...
总之,实现"ListView表头和第一列固定不动上下左右滑动"的功能需要对Android布局管理、滚动事件处理以及性能优化有深入理解。通过自定义组件、使用第三方库或者结合现有组件,都可以达到预期效果。在实际开发中,应...
在Android开发中,有时我们需要创建一个既可横向滚动又可竖向滚动的表格,这通常涉及到自定义ListView和HorizontalScrollView的组合使用。以下是对这个特殊需求的详细解释和实现思路: 首先,我们用ListView来处理...
【固定列头表头ListScroll】是一种在Android开发中实现的高级UI组件,它结合了ListView和ScrollView的优点,主要用于展示大量数据并具有横向滚动和纵向滚动功能的表格。这种组件通常用于显示复杂的数据结构,例如...
在示例中提到的ListView横向滚动示例,可能涉及到设置横向滚动的滚动方向,以及处理表头和固定列的问题。表头通常需要独立处理,保持在屏幕顶部固定,而列则需要在水平方向上滑动。这通常需要自定义Adapter和布局来...
总之,实现一个支持上下左右滑动并带有固定表头的ListView需要对Android的触摸事件处理、自定义View和Adapter有深入理解。通过这样的定制,我们可以为用户带来更丰富的交互体验,提高应用的可用性和吸引力。
在上下滑动ListView时,为了保持用户体验的一致性,通常会有一个列表头(Header)显示在最上方,固定不动。这可以通过在ListView中添加一个HeaderView来实现。在Android中,可以通过`addHeaderView()`方法将自定义...
在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。然而,标准的ListView只能上下滚动,但有时候我们可能需要实现一个可以左右滑动的ListView,这通常是通过自定义适配器和布局管理器来实现的...
至于标签中的"android", "双表头", "表格", "listview", "横向滑动",这些关键词都与实现双表头表格的关键技术相关。Android是开发平台,双表头和表格是指我们要构建的界面元素,ListView是核心组件,而横向滑动是...
在这里,我们可以将表头放入`HorizontalScrollView`中,使得用户可以左右滑动查看所有列标题。 3. **多选机制**: 多选功能通常需要配合`CheckBox`来实现。在每个列表项中添加一个复选框,用户可以通过点击来选择...
GridView允许我们将数据以行和列的形式组织起来,用户可以通过横向和纵向滑动来查看更多的内容。在Android中,我们可以使用GridView控件来实现,通过Adapter类填充数据,并设置相应的布局参数来调整网格的列数和间距...
17.9 为textarea加横向滚动条 17.10 记录滚动条位置 17.11 彩色滚动条 17.12 Windows XP的滚动条 第18章 在线考题案例 18.1 在线考试代码 18.2 在线考试代码(二) 18.3 在线测试代码(三) 18.4 多选考试题 18.5 ...
17.9 为textarea加横向滚动条 17.10 记录滚动条位置 17.11 彩色滚动条 17.12 Windows XP的滚动条 第18章 在线考题案例 18.1 在线考试代码 18.2 在线考试代码(二) 18.3 在线测试代码(三) 18.4 多选考试题 18.5 ...