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

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

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

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

效果图:

 

 

Activity代码代码 复制代码  收藏代码
  1. /**   
  2.  *    
  3.  * 带滑动表头与固定列的ListView   
  4.  */   
  5. public class HListActivity extends Activity{   
  6.      private ListView mListView;   
  7.      //方便测试,直接写的public    
  8.      public HorizontalScrollView mTouchView;   
  9.      //装入所有的HScrollView   
  10.      protected List<CHScrollView> mHScrollViews =new ArrayList<CHScrollView>();   
  11.        
  12.     @Override   
  13.     protected void onCreate(Bundle savedInstanceState) {   
  14.         super.onCreate(savedInstanceState);   
  15.         setContentView(R.layout.scroll);   
  16.         initViews();   
  17.     }   
  18.        
  19.     private void initViews() {   
  20.         List<Map<String, String>> datas = new ArrayList<Map<String,String>>();   
  21.         Map<String, String> data = null;   
  22.         CHScrollView headerScroll = (CHScrollView) findViewById(R.id.item_scroll_title);   
  23.         //添加头滑动事件    
  24.         mHScrollViews.add(headerScroll);   
  25.         mListView = (ListView) findViewById(R.id.scroll_list);   
  26.         for(int i = 0; i < 100; i++) {   
  27.             data = new HashMap<String, String>();   
  28.             data.put("title""Title_" + i);   
  29.             data.put("data_" + 1"Date_" + 1 + "_" +i );   
  30.             data.put("data_" + 2"Date_" + 2 + "_" +i );   
  31.             data.put("data_" + 3"Date_" + 3 + "_" +i );   
  32.             data.put("data_" + 4"Date_" + 4 + "_" +i );   
  33.             data.put("data_" + 5"Date_" + 5 + "_" +i );   
  34.             data.put("data_" + 6"Date_" + 6 + "_" +i );   
  35.             datas.add(data);   
  36.         }   
  37.         SimpleAdapter adapter = new ScrollAdapter(this, datas, R.layout.item   
  38.                             , new String[] { "title""data_1""data_2""data_3""data_4""data_5""data_6", }   
  39.                             , new int[] { R.id.item_title    
  40.                                         , R.id.item_data1   
  41.                                         , R.id.item_data2   
  42.                                         , R.id.item_data3   
  43.                                         , R.id.item_data4   
  44.                                         , R.id.item_data5   
  45.                                         , R.id.item_data6 });   
  46.         mListView.setAdapter(adapter);   
  47.     }   
  48.        
  49.     public void addHViews(final CHScrollView hScrollView) {   
  50.         if(!mHScrollViews.isEmpty()) {   
  51.             int size = mHScrollViews.size();   
  52.             CHScrollView scrollView = mHScrollViews.get(size - 1);   
  53.             final int scrollX = scrollView.getScrollX();   
  54.             //第一次满屏后,向下滑动,有一条数据在开始时未加入   
  55.             if(scrollX != 0) {   
  56.                 mListView.post(new Runnable() {   
  57.                     @Override   
  58.                     public void run() {   
  59.                         //当listView刷新完成之后,把该条移动到最终位置   
  60.                         hScrollView.scrollTo(scrollX, 0);   
  61.                     }   
  62.                 });   
  63.             }   
  64.         }   
  65.         mHScrollViews.add(hScrollView);   
  66.     }   
  67.        
  68.     public void onScrollChanged(int l, int t, int oldl, int oldt){   
  69.         for(CHScrollView scrollView : mHScrollViews) {   
  70.             //防止重复滑动   
  71.             if(mTouchView != scrollView)   
  72.                 scrollView.smoothScrollTo(l, t);   
  73.         }   
  74.     }   
  75.        
  76.     class ScrollAdapter extends SimpleAdapter {   
  77.   
  78.         private List<? extends Map<String, ?>> datas;   
  79.         private int res;   
  80.         private String[] from;   
  81.         private int[] to;   
  82.         private Context context;   
  83.         public ScrollAdapter(Context context,   
  84.                 List<? extends Map<String, ?>> data, int resource,   
  85.                 String[] from, int[] to) {   
  86.             super(context, data, resource, from, to);   
  87.             this.context = context;   
  88.             this.datas = data;   
  89.             this.res = resource;   
  90.             this.from = from;   
  91.             this.to = to;   
  92.         }   
  93.            
  94.         @Override   
  95.         public View getView(int position, View convertView, ViewGroup parent) {   
  96.             View v = convertView;   
  97.             if(v == null) {   
  98.                 v = LayoutInflater.from(context).inflate(res, null);   
  99.                 //第一次初始化的时候装进来   
  100.                 addHViews((CHScrollView) v.findViewById(R.id.item_scroll));   
  101.                 View[] views = new View[to.length];   
  102.                 for(int i = 0; i < to.length; i++) {   
  103.                     View tv = v.findViewById(to[i]);;   
  104.                     tv.setOnClickListener(clickListener);   
  105.                     views[i] = tv;   
  106.                 }   
  107.                 v.setTag(views);   
  108.             }   
  109.             View[] holders = (View[]) v.getTag();   
  110.             int len = holders.length;   
  111.             for(int i = 0 ; i < len; i++) {   
  112.                 ((TextView)holders[i]).setText(this.datas.get(position).get(from[i]).toString());   
  113.             }   
  114.             return v;   
  115.         }   
  116.     }   
  117.        
  118.     //测试点击的事件    
  119.     protected View.OnClickListener clickListener = new View.OnClickListener() {   
  120.         @Override   
  121.         public void onClick(View v) {   
  122.             Toast.makeText(HListActivity.this, ((TextView)v).getText(), Toast.LENGTH_SHORT).show();   
  123.         }   
  124.     };   
  125. }  

 

滑动view代码 复制代码  收藏代码
  1. /**   
  2. * 滑动代码   
  3. */   
  4. public class CHScrollView extends HorizontalScrollView {   
  5.        
  6.     HListActivity activity;   
  7.        
  8.     public CHScrollView(Context context, AttributeSet attrs, int defStyle) {   
  9.         super(context, attrs, defStyle);   
  10.         activity = (HListActivity) context;   
  11.     }   
  12.   
  13.        
  14.     public CHScrollView(Context context, AttributeSet attrs) {   
  15.         super(context, attrs);   
  16.         activity = (HListActivity) context;   
  17.     }   
  18.   
  19.     public CHScrollView(Context context) {   
  20.         super(context);   
  21.         activity = (HListActivity) context;   
  22.     }   
  23.        
  24.     @Override   
  25.     public boolean onTouchEvent(MotionEvent ev) {   
  26.         //进行触摸赋值   
  27.         activity.mTouchView = this;   
  28.         return super.onTouchEvent(ev);   
  29.     }   
  30.        
  31.     @Override   
  32.     protected void onScrollChanged(int l, int t, int oldl, int oldt) {   
  33.         //当当前的CHSCrollView被触摸时,滑动其它   
  34.         if(activity.mTouchView == this) {   
  35.             activity.onScrollChanged(l, t, oldl, oldt);   
  36.         }else{   
  37.             super.onScrollChanged(l, t, oldl, oldt);   
  38.         }   
  39.     }   
  40. }  
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值