位置: 编程技术 - 正文

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 (二)

  • 商铺税费怎么算2021
  • 小规模企业所得税多少
  • 股东投资款给自己发工资如何处理?
  • 药店的主营业务有哪些
  • 财务金额表格
  • 简易征收预缴税款交错了
  • 购进货物用于在建工程要交增值税吗
  • 跨年的费用怎么调整
  • 建筑公司核定征收所得税怎么算
  • 商贸流通企业包括哪些
  • 手续费及佣金收入
  • 长期借款科目核算的是企业的长期借款本金和利息
  • 简易计税收入会计分录
  • 企业所得税弥补亏损年限
  • 上海航交所官网
  • 企业所得税核定征收怎么计算
  • 公司向个人租车协议范本
  • 金融企业不良资产批量收购处置业务
  • 工程发票需要进项吗
  • 基础设施建设包括哪些方面
  • 投资性房地产属于流动资产吗
  • windows 10怎么回事
  • 企业所得税是什么时候计提
  • 原材料暂估分录
  • linux i
  • php总结
  • macOS Big Sur 11.3 开发预览版 Beta正式更新
  • 短期投资的入账金额包括已宣告未发放的现金股利
  • 下一页分页符中间空白页
  • php+mysql+ajax实现单表多字段多关键词查询的方法
  • 单位发放给职工的养老金
  • php redis秒杀高并发解决方案
  • uni-app ——使用uploadFile上传多张图片
  • 办理组织机构代码证需要什么材料
  • 残差网络中的残差指的是什么
  • 如何计提所得税费用科目
  • 个体户做账流程新手必看
  • 预缴的企业所得税能抵扣企业所得额嘛
  • 什么是稳岗补贴是给企业发放吗
  • 公司股东会和董事会
  • 商标注册费用可以退吗
  • sql server 2008设置角色
  • mysql分库分表实践
  • 同一控制下企业合并发生的审计费用计入
  • 长期股权投资其他债券投资公允价值变动
  • 补贴,津贴是否合理
  • mysql数据库操作中,use是用来做什么的?
  • 个人住房租赁给公司如何开票
  • 怎么打印银行对账单
  • 出差补助是否计入工资总额
  • 资本公积的账务处理例题
  • 建筑企业增值税怎么算
  • 典当业销售的死当物品是什么意思
  • 垃圾处理费如何做账
  • 暂估费用的账务处理管理
  • 公司返聘退休人员的员工比例有没有规定
  • 企业的利润怎么提出来
  • 篮球俱乐部归什么部门管理
  • 母公司及子公司增资
  • mysql字段名可以用中文吗
  • win8开机启动项怎么设置方法
  • fcitx输入法配置
  • windowssystem32oobe找不到指定的路径
  • win10预览版和正式版区别
  • Linux操作系统软链接和硬链接的联系与区别
  • linux纯文本浏览器
  • win7能用多屏协同吗
  • python 归并排序算法
  • 将目录下的文件和文件夹按类型排序
  • 实用的批处理
  • fiori开发
  • js 时间轴
  • JavaScript italics方法入门实例(把字符串显示为斜体)
  • jquery常见问题
  • ajax实现无刷新
  • 安卓获取图片路径
  • 电子税务局官网江西省
  • 刷医保的网络可以用外网吗
  • 小规模纳税人个税税率
  • 快递公司开票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设