热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要介绍了Android程序开发之ListView实现横向滚动(带表头与固定列)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

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

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

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

效果图:

 

Activity代码

/** 
* 
* 带滑动表头与固定列的ListView 
*/ 
public class HListActivity extends Activity{ 
private ListView mListView; 
//方便测试,直接写的public 
public HorizontalScrollView mTouchView; 
//装入所有的HScrollView 
protected List mHScrollViews =new ArrayList(); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.scroll); 
initViews(); 
} 
private void initViews() { 
List> datas = new ArrayList>(); 
Map 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(); 
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<&#63; extends Map> datas; 
private int res; 
private String[] from; 
private int[] to; 
private Context context; 
public ScrollAdapter(Context context, 
List<&#63; extends Map> 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 

滑动view代码

/** 
* 滑动代码 
*/ 
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实现横向滚动(带表头与固定列),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Manacher算法详解:寻找最长回文子串
    本文将详细介绍Manacher算法,该算法用于高效地找到字符串中的最长回文子串。通过在字符间插入特殊符号,Manacher算法能够同时处理奇数和偶数长度的回文子串问题。 ... [详细]
  • A*算法在AI路径规划中的应用
    路径规划算法用于在地图上找到从起点到终点的最佳路径,特别是在存在障碍物的情况下。A*算法是一种高效且广泛使用的路径规划算法,适用于静态和动态环境。 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 解决SQL Server数据库sa登录名无法连接的问题
    在安装SQL Server数据库后,使用Windows身份验证成功,但使用SQL Server身份验证时遇到问题。本文将介绍如何通过设置sa登录名的密码、启用登录名状态以及开启TCP协议来解决这一问题。 ... [详细]
  • MySQL 数据库连接方法
    本文介绍了如何使用 MySQL 命令行工具连接到指定的数据库。 ... [详细]
  • 在 Mac 上配置 NDK
    本文详细介绍了如何在 Mac 上配置 Android NDK,包括设置环境变量和解决常见问题的方法。 ... [详细]
  • 如何解决8080端口被占用问题
    本文介绍了如何通过命令行和任务管理器查找并终止占用8080端口的进程,以确保该端口能够正常使用。 ... [详细]
  • Excel 数据分析基础
    Excel 是数据分析中最基本且强大的工具之一,具备多种实用功能和操作方法。本文将简要介绍 Excel 的不同版本及其兼容性问题,并探讨在处理大数据时的替代方案。 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文详细介绍了 Charles 工具的下载、安装、配置及使用方法,特别针对 HTTP 和 HTTPS 协议的数据抓取进行了说明。 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
author-avatar
杰ZGJ8513
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有