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

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

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

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

效果图:

Activity代码

/** * * 带滑动表头与固定列的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(); } }; }

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

时间: 2024-11-10 08:01:36

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

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

问题背景:在做图表展示的时候,ListView可以上下左右滑动,但最左边一列在向右滑动时,保持不变,表头在向下滑动时保持不变. 有用两个ListView实现的,但测试过,好像有些问题 这个例子是通过(ListView + HorizontalScrollView)实现的 效果图:   Activity代码 /** * * 带滑动表头与固定列的ListView */ public class HListActivity extends Activity{ private ListView mLis

Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多_Android

最近做的类似于微博的项目中,有个Android功能要使用到listview的向下拉刷新来刷新最新消息,向上拉刷新(滑动分页)来加载更多. 新浪微博就是使用这种方式的典型. 当用户从网络上读取微博的时候,如果一下子全部加载用户未读的微博这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容.这时候,我们就需要用到另一个功能,那就是listview的分页了,其实这个分页可以做成客户端的分页,也可以做成服务器端的分页(点击加载时,从服务器对应的加载第N页就好了!!!).通过分

Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多

最近做的类似于微博的项目中,有个Android功能要使用到listview的向下拉刷新来刷新最新消息,向上拉刷新(滑动分页)来加载更多. 新浪微博就是使用这种方式的典型. 当用户从网络上读取微博的时候,如果一下子全部加载用户未读的微博这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容.这时候,我们就需要用到另一个功能,那就是listview的分页了,其实这个分页可以做成客户端的分页,也可以做成服务器端的分页(点击加载时,从服务器对应的加载第N页就好了!!!).通过分

Android程序开发之ListView 与PopupWindow实现从左向右滑动删除功能_Android

文章实现的功能是:在ListView的Item上从右向左滑时,出现删除按钮,点击删除按钮把Item删除. 看过文章后,感觉没有必要把dispatchTouchEvent()和onTouchEvent()两个方法都重写,只要重写onTouchEvent就好了.于是对代码作了一些调整: public class MyListView extends ListView { private static final String TAG = "MyListView"; private int

Android程序开发之Fragment实现底部导航栏实例代码_Android

流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 说明 IDE:AS,Android studio; 模拟器:genymotion; 实现的效果,见下图. 具体实现 为了讲明白这个实现过程,我们贴出来的代码多一写,这样更方便理解 [最后还会放出完整的代码实现] .看上图的界面做的比较粗糙,但实现过程的骨架都具有了,想要更完美的设计,之后自行完善吧 ^0^. 布局 通过观察上述效果图,发现任意一个选项页面都有三部分组成: 顶部去除ActionBar后的标题栏: 中间一个Fragment

Android程序开发之WebView使用总结

前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 使用场景: 1.)添加权限 <uses-permission android:name="android.permission.INTERNET" /> 2.)布局文件 <WebView android:id="@+id/webView" android:layout_width="match_parent" andr

Android程序开发之UIScrollerView里有两个tableView

一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController <UIScrollViewDelegate,UITableViewDelegate,UITableViewDataSource> { UIScrollView *_scrolView; UITableView *_tableView; UITableView

Android程序开发之Fragment实现底部导航栏实例代码

流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 说明 IDE:AS,Android studio; 模拟器:genymotion; 实现的效果,见下图. 具体实现 为了讲明白这个实现过程,我们贴出来的代码多一写,这样更方便理解 [最后还会放出完整的代码实现] .看上图的界面做的比较粗糙,但实现过程的骨架都具有了,想要更完美的设计,之后自行完善吧 ^0^. 布局 通过观察上述效果图,发现任意一个选项页面都有三部分组成: 顶部去除ActionBar后的标题栏: 中间一个Fragment

安卓开发之ListView(HorizontalListView)横向动态加载数据例子

这个自定义的控件可以实现横向的动态数据加载,话不多说,下面上代码.(使用方法和普通listview一致) 1.在布局里用HorizontalScrollView包含一个ListView: 2.利用GridView,把它的行数设为1行: HorizontalListView.java: package cn.zmit.xianneng.widget; import java.util.LinkedList; import java.util.Queue; import android.conten