位置: 编程技术 - 正文

HorizontalListView

编辑:rootadmin
package com.study.study;/* * HorizontalListView.java v1.5 * * * The MIT License * Copyright (c) Paul Soucy (paul@dev-smart.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */import java.util.LinkedList;import java.util.Queue;import android.content.Context;import android.database.DataSetObserver;import android.graphics.Rect;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.GestureDetector.OnGestureListener;import android.view.MotionEvent;import android.view.View;import android.widget.AdapterView;import android.widget.ListAdapter;import android.widget.Scroller;public class HorizontalListView extends AdapterView<ListAdapter> { public boolean mAlwaysOverrideTouch = true; protected ListAdapter mAdapter; private int mLeftViewIndex = -1; private int mRightViewIndex = 0; protected int mCurrentX; protected int mNextX; private int mMaxX = Integer.MAX_VALUE; private int mDisplayOffset = 0; protected Scroller mScroller; private GestureDetector mGesture; private Queue<View> mRemovedViewQueue = new LinkedList<View>(); private OnItemSelectedListener mOnItemSelected; private OnItemClickListener mOnItemClicked; private OnItemLongClickListener mOnItemLongClicked; private boolean mDataChanged = false; public HorizontalListView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private synchronized void initView() { mLeftViewIndex = -1; mRightViewIndex = 0; mDisplayOffset = 0; mCurrentX = 0; mNextX = 0; mMaxX = Integer.MAX_VALUE; mScroller = new Scroller(getContext()); mGesture = new GestureDetector(getContext(), mOnGesture); } @Override public void setOnItemSelectedListener( AdapterView.OnItemSelectedListener listener) { mOnItemSelected = listener; } @Override public void setOnItemClickListener(AdapterView.OnItemClickListener listener) { mOnItemClicked = listener; } @Override public void setOnItemLongClickListener( AdapterView.OnItemLongClickListener listener) { mOnItemLongClicked = listener; } private DataSetObserver mDataObserver = new DataSetObserver() { @Override public void onChanged() { synchronized (HorizontalListView.this) { mDataChanged = true; } invalidate(); requestLayout(); } @Override public void onInvalidated() { reset(); invalidate(); requestLayout(); } }; @Override public ListAdapter getAdapter() { return mAdapter; } @Override public View getSelectedView() { // TODO: implement return null; } @Override public void setAdapter(ListAdapter adapter) { if (mAdapter != null) { mAdapter.unregisterDataSetObserver(mDataObserver); } mAdapter = adapter; mAdapter.registerDataSetObserver(mDataObserver); reset(); } private synchronized void reset() { initView(); removeAllViewsInLayout(); requestLayout(); } @Override public void setSelection(int position) { // TODO: implement } private void addAndMeasureChild(final View child, int viewPos) { LayoutParams params = child.getLayoutParams(); if (params == null) { params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); } addViewInLayout(child, viewPos, params, true); child.measure( MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); } @Override protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (mAdapter == null) { return; } if (mDataChanged) { int oldCurrentX = mCurrentX; initView(); removeAllViewsInLayout(); mNextX = oldCurrentX; mDataChanged = false; } if (mScroller.computeScrollOffset()) { int scrollx = mScroller.getCurrX(); mNextX = scrollx; } if (mNextX <= 0) { mNextX = 0; mScroller.forceFinished(true); } if (mNextX >= mMaxX) { mNextX = mMaxX; mScroller.forceFinished(true); } int dx = mCurrentX - mNextX; removeNonVisibleItems(dx); fillList(dx); positionItems(dx); mCurrentX = mNextX; if (!mScroller.isFinished()) { post(new Runnable() { @Override public void run() { requestLayout(); } }); } } private void fillList(final int dx) { int edge = 0; View child = getChildAt(getChildCount() - 1); if (child != null) { edge = child.getRight(); } fillListRight(edge, dx); edge = 0; child = getChildAt(0); if (child != null) { edge = child.getLeft(); } fillListLeft(edge, dx); } private void fillListRight(int rightEdge, final int dx) { while (rightEdge &#; dx < getWidth() && mRightViewIndex < mAdapter.getCount()) { View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this); addAndMeasureChild(child, -1); rightEdge &#;= child.getMeasuredWidth(); if (mRightViewIndex == mAdapter.getCount() - 1) { mMaxX = mCurrentX &#; rightEdge - getWidth(); } if (mMaxX < 0) { mMaxX = 0; } mRightViewIndex&#;&#;; } } private void fillListLeft(int leftEdge, final int dx) { while (leftEdge &#; dx > 0 && mLeftViewIndex >= 0) { View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this); addAndMeasureChild(child, 0); leftEdge -= child.getMeasuredWidth(); mLeftViewIndex--; mDisplayOffset -= child.getMeasuredWidth(); } } private void removeNonVisibleItems(final int dx) { View child = getChildAt(0); while (child != null && child.getRight() &#; dx <= 0) { mDisplayOffset &#;= child.getMeasuredWidth(); mRemovedViewQueue.offer(child); removeViewInLayout(child); mLeftViewIndex&#;&#;; child = getChildAt(0); } child = getChildAt(getChildCount() - 1); while (child != null && child.getLeft() &#; dx >= getWidth()) { mRemovedViewQueue.offer(child); removeViewInLayout(child); mRightViewIndex--; child = getChildAt(getChildCount() - 1); } } private void positionItems(final int dx) { if (getChildCount() > 0) { mDisplayOffset &#;= dx; int left = mDisplayOffset; for (int i = 0; i < getChildCount(); i&#;&#;) { View child = getChildAt(i); int childWidth = child.getMeasuredWidth(); child.layout(left, 0, left &#; childWidth, child.getMeasuredHeight()); left &#;= childWidth; } } } public synchronized void scrollTo(int x) { mScroller.startScroll(mNextX, 0, x - mNextX, 0); requestLayout(); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { boolean handled = super.dispatchTouchEvent(ev); handled |= mGesture.onTouchEvent(ev); return handled; } protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { synchronized (HorizontalListView.this) { mScroller.fling(mNextX, 0, (int) -velocityX, 0, 0, mMaxX, 0, 0); } requestLayout(); return true; } protected boolean onDown(MotionEvent e) { mScroller.forceFinished(true); return true; } private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDown(MotionEvent e) { return HorizontalListView.this.onDown(e); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return HorizontalListView.this .onFling(e1, e2, velocityX, velocityY); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { synchronized (HorizontalListView.this) { mNextX &#;= (int) distanceX; } requestLayout(); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { for (int i = 0; i < getChildCount(); i&#;&#;) { View child = getChildAt(i); if (isEventWithinView(e, child)) { if (mOnItemClicked != null) { mOnItemClicked.onItemClick(HorizontalListView.this, child, mLeftViewIndex &#; 1 &#; i, mAdapter.getItemId(mLeftViewIndex &#; 1 &#; i)); } if (mOnItemSelected != null) { mOnItemSelected.onItemSelected(HorizontalListView.this, child, mLeftViewIndex &#; 1 &#; i, mAdapter.getItemId(mLeftViewIndex &#; 1 &#; i)); } break; } } return true; } @Override public void onLongPress(MotionEvent e) { int childCount = getChildCount(); for (int i = 0; i < childCount; i&#;&#;) { View child = getChildAt(i); if (isEventWithinView(e, child)) { if (mOnItemLongClicked != null) { mOnItemLongClicked.onItemLongClick( HorizontalListView.this, child, mLeftViewIndex &#; 1 &#; i, mAdapter.getItemId(mLeftViewIndex &#; 1 &#; i)); } break; } } } private boolean isEventWithinView(MotionEvent e, View child) { Rect viewRect = new Rect(); int[] childPosition = new int[2]; child.getLocationOnScreen(childPosition); int left = childPosition[0]; int right = left &#; child.getWidth(); int top = childPosition[1]; int bottom = top &#; child.getHeight(); viewRect.set(left, top, right, bottom); return viewRect.contains((int) e.getRawX(), (int) e.getRawY()); } };}

推荐整理分享HorizontalListView,希望有所帮助,仅作参考,欢迎阅读内容。

HorizontalListView

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

ActivityManagerService (二) 文章出处:

android寻找最适合资源过程 Whenyourequestaresourceforwhichyouprovidealternatives,Androidselectswhichalternativeresourcetouseatruntime,dependingonthecurrentdeviceconfiguration.TodemonstratehowAndroidselectsanalternativeresource,

ActivityManagerService (三) 文章出处:

标签: HorizontalListView

本文链接地址:https://www.jiuchutong.com/biancheng/385958.html 转载请保留说明!

上一篇:Genymotion首次运行程序出现错误Installation error: INSTALL_FAILED_CPU_ABI_INCOMPATIBLE

下一篇:ActivityManagerService (二)

  • 母公司给子公司注资需要什么手续
  • 广告赞助支出可以抵税吗
  • 其他应付款计入资本公积
  • 银行账户利息怎么记账
  • 单位发放中秋月饼价值有规定吗
  • 劳务派遣怎么做起来
  • 房贷利息抵个税细则 两套房
  • 主营业务成本如何算
  • 技术服务行业分析
  • 案例分析小规模纳税人月销售不足3万如何处理?
  • 公司开给个人的发票有什么用
  • 已过认证周期什么意思
  • 印刷制作费税收编码是啥
  • 作进项税转出
  • 按季申报是什么意思
  • 房产税征收范围包括商铺吗
  • 公户以借款形式打款给个人,对个人有影响么?
  • 开土地租赁发票需要交哪些税费
  • 劳动保护用品应由什么开支
  • 企业收到外部水电费如何做账?
  • 企业为员工购买社保缴费标准
  • 外币财务报表折算未分配利润采用什么汇率
  • 如何把操作系统转移到固态硬盘
  • 初级会计实务的心得体会
  • 经费支出渠道
  • 收到政府部门的奖励金怎么入账
  • 一次性补偿金在取得后间隔一个月申报可以吗
  • scrfs.exe - scrfs是什么进程 有什么用
  • 经营免租期是什么意思
  • 辅导期内的企业有哪些
  • 显示器有必要买240hz吗
  • 国内来料加工委托方需要报关吗
  • 在途物资属于什么存货
  • echars legend
  • 利用matlab作图
  • sklearn报错
  • 史上最强i3
  • php设置目录权限
  • 数据库如何迁移数据库表
  • C语言中指针变量指向字符串时是有效字符的长度吗
  • python3.4 numpy
  • 在税务局怎么查补缴的社保
  • 社保断交一个月但是后面正常缴费
  • 应付票据应付利息
  • 所有者权益变动表模板excel
  • 开红字信息表后的账务处理
  • 工地购买的厨房用品计入哪个科目
  • 出售持有股票会计处理
  • phpcms怎么样
  • 缴纳税收的凭证怎么打印
  • 年末财务报表是什么
  • 土地增值税预缴计算方法70号公告
  • sqlserver重复数据
  • 内部审计主要目的
  • 开具发票后什么情况下可以零申报?
  • 经营过程中借股怎么处理
  • 增值税发票开错冲红重开如何做会计分录?
  • 资产利润率在1104哪个表
  • 收到股东投资如何做账
  • 差旅费的进项税额需要转出吗
  • 建账有哪些步骤,每个步骤有哪些注意事项
  • windowssystem32oobe找不到指定的路径
  • 系统之家一键重装系统教程
  • mac电脑废纸篓清空文件恢复
  • 一键ghostcgi
  • win7系统怎么禁止软件自启动
  • sendmail端口
  • cocos2dx运行原理
  • nodeJS文件操作自动创建目录
  • 高效的python
  • python中读取excel
  • opengl和openglskia
  • dos命令中删除文件命令有哪些
  • 浅谈如何加强基层党组织建设
  • java list转set的方法
  • centos打开shell
  • javascript中对象的含义
  • 孙其功陪你学之——unity3d进程暂停
  • 安卓系统手机图片文件夹在哪里
  • 什么叫税务协查
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设