免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3458 | 回复: 3
打印 上一主题 下一主题

Android支持横行滚动的ListView控件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-19 21:36 |只看该作者 |倒序浏览
Android支持横行滚动的ListView控件
  1. import android.content.Context;
  2. import android.util.AttributeSet;
  3. import android.view.GestureDetector.OnGestureListener;
  4. import android.view.GestureDetector;
  5. import android.view.MotionEvent;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.LinearLayout;
  9. import android.widget.ListView;

  10. /**
  11. * 自定义支持横向滚动的ListView
  12. * @author 农民伯伯
  13. * @version 2011-12-4
  14. *
  15. */
  16. public class HVListView extends ListView {

  17. /** 手势 */
  18. private GestureDetector mGesture;
  19. /** 列头 */
  20. public LinearLayout mListHead;
  21. /** 偏移坐标 */
  22. private int mOffset = 0;
  23. /** 屏幕宽度 */
  24. private int screenWidth;

  25. /** 构造函数 */
  26. public HVListView(Context context, AttributeSet attrs) {
  27. super(context, attrs);
  28. mGesture = new GestureDetector(context, mOnGesture);
  29. }

  30. /** 分发触摸事件 */
  31. @Override
  32. public boolean dispatchTouchEvent(MotionEvent ev) {
  33. super.dispatchTouchEvent(ev);
  34. return mGesture.onTouchEvent(ev);
  35. }

  36. /** 手势 */
  37. private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() {

  38. @Override
  39. public boolean onDown(MotionEvent e) {
  40. return true;
  41. }

  42. @Override
  43. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  44. float velocityY) {
  45. return false;
  46. }

  47. /** 滚动 */
  48. @Override
  49. public boolean onScroll(MotionEvent e1, MotionEvent e2,
  50. float distanceX, float distanceY) {
  51. synchronized (HVListView.this) {
  52. int moveX = (int) distanceX;
  53. int curX = mListHead.getScrollX();
  54. int scrollWidth = getWidth();
  55. int dx = moveX;
  56. //控制越界问题
  57. if (curX + moveX < 0)
  58. dx = 0;
  59. if (curX + moveX + getScreenWidth() > scrollWidth)
  60. dx = scrollWidth - getScreenWidth() - curX;

  61. mOffset += dx;
  62. //根据手势滚动Item视图
  63. for (int i = 0, j = getChildCount(); i < j; i++) {
  64. View child = ((ViewGroup) getChildAt(i)).getChildAt(1);
  65. if (child.getScrollX() != mOffset)
  66. child.scrollTo(mOffset, 0);
  67. }
  68. mListHead.scrollBy(dx, 0);
  69. }
  70. requestLayout();
  71. return true;
  72. }
  73. };


  74. /**
  75. * 获取屏幕可见范围内最大屏幕
  76. * @return
  77. */
  78. public int getScreenWidth() {
  79. if (screenWidth == 0) {
  80. screenWidth = getContext().getResources().getDisplayMetrics().widthPixels;
  81. if (getChildAt(0) != null) {
  82. screenWidth -= ((ViewGroup) getChildAt(0)).getChildAt(0)
  83. .getMeasuredWidth();
  84. } else if (mListHead != null) {
  85. //减去固定第一列
  86. screenWidth -= mListHead.getChildAt(0).getMeasuredWidth();
  87. }
  88. }
  89. return screenWidth;
  90. }

  91. /** 获取列头偏移量 */
  92. public int getHeadScrollX() {
  93. return mListHead.getScrollX();
  94. }
  95. }


  96. package com.nmbb;

  97. import android.app.Activity;
  98. import android.os.Bundle;
  99. import android.view.LayoutInflater;
  100. import android.view.View;
  101. import android.view.ViewGroup;
  102. import android.widget.BaseAdapter;
  103. import android.widget.LinearLayout;
  104. import android.widget.TextView;

  105. /**
  106. * 测试Activity
  107. * @author 农民伯伯
  108. * @version 2011-12-4
  109. *
  110. */
  111. public class TestHVListViewActivity extends Activity {

  112. private LayoutInflater mInflater;

  113. private HVListView mListView;

  114. /** Called when the activity is first created. */
  115. @Override
  116. public void onCreate(Bundle savedInstanceState) {
  117. super.onCreate(savedInstanceState);
  118. setContentView(R.layout.main);

  119. mListView = (HVListView) findViewById(android.R.id.list);
  120. //设置列头
  121. mListView.mListHead = (LinearLayout) findViewById(R.id.head);
  122. //设置数据
  123. mListView.setAdapter(new DataAdapter());

  124. mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
  125. }

  126. private class DataAdapter extends BaseAdapter {

  127. @Override
  128. public int getCount() {
  129. return 50;//固定显示50行数据
  130. }

  131. @Override
  132. public View getView(int position, View convertView, ViewGroup parent) {
  133. if (convertView == null) {
  134. convertView = mInflater.inflate(R.layout.item, null);
  135. }

  136. for (int i = 0; i < 8; i++) {
  137. ((TextView) convertView.findViewById(R.id.item2 + i)).setText("数据" + position + "行" + (i + 2) + "列");
  138. }

  139. //校正(处理同时上下和左右滚动出现错位情况)
  140. View child = ((ViewGroup) convertView).getChildAt(1);
  141. int head = mListView.getHeadScrollX();
  142. if (child.getScrollX() != head) {
  143. child.scrollTo(mListView.getHeadScrollX(), 0);
  144. }
  145. return convertView;
  146. }

  147. @Override
  148. public Object getItem(int position) {
  149. return null;
  150. }

  151. @Override
  152. public long getItemId(int position) {
  153. return 0;
  154. }
  155. }
  156. }
复制代码
item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
androidrientation="horizontal" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:id="@+id/item1" android:text="不动列头1"
android:textSize="20.0sp" android:gravity="center"
android:layout_width="100.0dip" android:layout_height="wrap_content"></TextView>
<LinearLayout androidrientation="horizontal" android:id="@+id/head"
android:layout_width="1200.0dip" android:layout_height="wrap_content">
<TextView android:id="@+id/item2" android:text="不动列头2"
android:textColor="@android:color/black" android:textSize="20.0sp"
android:singleLine="true" android:gravity="center"
android:layout_width="150.0dip" android:layout_height="wrap_content"></TextView>
<TextView android:id="@+id/item3" android:text="不动列头3"
android:textSize="20.0sp" android:singleLine="true" android:gravity="center"
android:layout_width="150.0dip" android:layout_height="wrap_content"></TextView>
<TextView android:id="@+id/item4" android:text="不动列头4"
android:textColor="@android:color/black" android:textSize="20.0sp"
android:singleLine="true" android:gravity="center"
android:layout_width="150.0dip" android:layout_height="wrap_content"></TextView>
<TextView android:id="@+id/item5" android:text="不动列头5"
android:textSize="20.0sp" android:singleLine="true" android:gravity="center"
android:layout_width="150.0dip" android:layout_height="wrap_content"></TextView>
<TextView android:id="@+id/item6" android:text="不动列头6"
android:textColor="@android:color/black" android:textSize="20.0sp"
android:singleLine="true" android:gravity="center"
android:layout_width="150.0dip" android:layout_height="wrap_content"></TextView>
<TextView android:id="@+id/item7" android:text="不动列头7"
android:textSize="20.0sp" android:singleLine="true" android:gravity="center"
android:layout_width="150.0dip" android:layout_height="wrap_content"></TextView>
<TextView android:id="@+id/item8" android:text="不动列头8"
android:textColor="@android:color/black" android:textSize="20.0sp"
android:singleLine="true" android:gravity="center"
android:layout_width="150.0dip" android:layout_height="wrap_content"></TextView>
<TextView android:id="@+id/item9" android:text="不动列头9"
android:textSize="20.0sp" android:singleLine="true" android:gravity="center"
android:layout_width="150.0dip" android:layout_height="wrap_content"></TextView>
</LinearLayout>
</LinearLayout>

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
androidrientation="vertical" android:background="#eeffcc"
android:layout_width="wrap_content" android:layout_height="fill_parent">
<include layout="@layout/item" />
<com.nmbb.HVListView android:id="@android:id/list"
android:background="#FFB84D" android:fastScrollEnabled="true"
android:fadingEdgeLength="0.0sp" android:layout_width="1400.0dip"
android:layout_height="fill_parent" android:drawSelectorOnTop="false"
android:cacheColorHint="@null" android:dividerHeight="1.0dip">
</com.nmbb.HVListView>
</LinearLayout>

论坛徽章:
0
2 [报告]
发表于 2012-01-19 22:05 |只看该作者
谢谢分享

论坛徽章:
0
3 [报告]
发表于 2012-01-24 00:00 |只看该作者
谢谢分享。

论坛徽章:
0
4 [报告]
发表于 2014-07-10 15:03 |只看该作者
真心赞的控件知识分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP