首页 > 移动开发 > 多个ListView同步滚动

多个ListView同步滚动

引言:

开发的过程中可能会遇到2个或者更多的listview为了保持对应关系一起滚动的情况,这篇文章给大家演示这种效果。


效果:

实现原理:

在滚动其中任何一个ListView的时候,同时设置其他ListView的滚动位置。示例中使用的是水平ListView。

HListView的项目托管地址是:https://github.com/sephiroth74/HorizontalVariableListView   有兴趣的可以研究一下

步骤:

1、为了能实现同时滚动的情况,有一些条件,首先是HListView的Item的宽度是一一直的,如我设置的

[html]

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <TextView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="60dp"  
  4.     android:layout_height="60dp"  
  5.     android:gravity="center"  
  6.     android:background="#abcdef"  
  7.     android:text="Terry10" />  


2、为了大家只管的感受做法,我将源码贴出如下,大家着重看关键代码即可:

[java]

  1. public class MainActivity extends Activity {  
  2.   
  3.     private HListView mListView1;  
  4.     private HListView mListView2;  
  5.     private HListView mListView3;  
  6.     private HListView mListView4;  
  7.     private HListView mListView5;  
  8.     private List<HListView> viewList = new ArrayList<HListView>();  
  9.   
  10.     private String[] contentArray = new String[] { "Terry1""Terry2",  
  11.             "Terry3""Terry4""Terry5""Terry6""Terry7""Terry8",  
  12.             "Terry9""Terry10""Terry11""Terry12""Terry13""Terry14",  
  13.             "Terry15""Terry16""Terry17""Terry18" };  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_main);  
  19.         mListView1 = (HListView) findViewById(R.id.listview1);  
  20.         mListView2 = (HListView) findViewById(R.id.listview2);  
  21.         mListView3 = (HListView) findViewById(R.id.listview3);  
  22.         mListView4 = (HListView) findViewById(R.id.listview4);  
  23.         mListView5 = (HListView) findViewById(R.id.listview5);  
  24.   
  25.         mListView1.setAdapter(new MyAdapter());  
  26.         mListView2.setAdapter(new MyAdapter());  
  27.         mListView3.setAdapter(new MyAdapter());  
  28.         mListView4.setAdapter(new MyAdapter());  
  29.         mListView5.setAdapter(new MyAdapter());  
  30.   
  31.         viewList.add(mListView1);  
  32.         viewList.add(mListView2);  
  33.         viewList.add(mListView3);  
  34.         viewList.add(mListView4);  
  35.         viewList.add(mListView5);  
  36.   
  37.         MyScrollListener mListener = new MyScrollListener();  
  38.         for (HListView item : viewList) {  
  39.             item.setOnScrollListener(mListener);  
  40.         }  
  41.     }  
  42.   
  43.     private class MyScrollListener implements OnScrollListener {  
  44.   
  45.         @Override  
  46.         public void onScrollStateChanged(AbsHListView view, int scrollState) {  
  47.             // 关键代码  
  48.             if (scrollState == SCROLL_STATE_IDLE  
  49.                     || scrollState == SCROLL_STATE_TOUCH_SCROLL) {  
  50.                 View subView = view.getChildAt(0);  
  51.                 if (subView != null) {  
  52.                     final int top = subView.getLeft();  
  53.                     final int position = view.getFirstVisiblePosition();  
  54.                     for (HListView item : viewList) {  
  55.                         item.setSelectionFromLeft(position, top);  
  56.                     }  
  57.                 }  
  58.             }  
  59.         }  
  60.   
  61.         @Override  
  62.         public void onScroll(AbsHListView view, int firstVisibleItem,  
  63.                 int visibleItemCount, int totalItemCount) {  
  64.             // 关键代码  
  65.             View subView = view.getChildAt(0);  
  66.             if (subView != null) {  
  67.                 final int top = subView.getLeft();  
  68.                 for (HListView item : viewList) {  
  69.                     item.setSelectionFromLeft(firstVisibleItem, top);  
  70.                 }  
  71.             }  
  72.         }  
  73.   
  74.     }  
  75.   
  76.     private class MyAdapter extends BaseAdapter {  
  77.   
  78.         @Override  
  79.         public int getCount() {  
  80.             return contentArray.length;  
  81.         }  
  82.   
  83.         @Override  
  84.         public Object getItem(int position) {  
  85.             return contentArray[position];  
  86.         }  
  87.   
  88.         @Override  
  89.         public long getItemId(int position) {  
  90.             return position;  
  91.         }  
  92.   
  93.         @Override  
  94.         public View getView(int position, View convertView, ViewGroup parent) {  
  95.             TextView tv = (TextView) getLayoutInflater().inflate(R.layout.item,  
  96.                     parent, false);  
  97.             tv.setText(contentArray[position]);  
  98.             return tv;  
  99.         }  
  100.   
  101.     }  
  102. }  

本文固定链接: http://www.devba.com/index.php/archives/6045.html | 开发吧

报歉!评论已关闭.