位置: 编程技术 - 正文

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

  • 增值税发票没了能补开吗
  • 贷款公司是怎么贷款的
  • 没有达到起征点的工资忘计申报个税,可以税前扣除吗
  • 固定资产投资损失怎么做账
  • 预付加油卡发票可以报销吗
  • 餐饮通用机打发票可以报销吗
  • 股东放弃公司债权
  • 取得增值税专用发票要算税吗
  • 稽查补缴增值税做账
  • 上年度亏损用什么弥补
  • 企业增加实收资本
  • 代扣代缴增值税是什么意思
  • 营改增之后账务怎么处理
  • 没交社保能扣工伤保险吗
  • 为什么报税资料老是显示有
  • 资产处置损益在企业所得税汇算时如何填列
  • 汽车罚款怎么进账
  • 劳务派遣个税怎么扣
  • 跨期间收入如何确定当期收入
  • 生产成本可以结转到其他业务成本吗
  • 税前利润的公式有哪些
  • win10更新kb5005033
  • movie maker是什么软件
  • 怎么登明细分类账
  • 应发工资扣税
  • LNMP部署laravel以及xhprof安装使用教程
  • 北京猿创源科技有限公司
  • 卷积神经网络有哪些
  • php路径问题
  • 商贸公司用什么名字最好
  • mysqldump语句
  • 帝国cms功能
  • 开了专票就不能享受政策
  • 增值税申报表中销售额
  • 财务费用税前扣除标准是多少
  • 医疗服务增值税税率
  • 应付账款转收入摘要怎么写
  • 一般纳税人的商业保险可以开票吗
  • 劳务派遣公司开票内容写什么
  • 薪酬范围怎么写
  • 员工多交个税企业就少交所得税吗?
  • 职工教育经费是否可以抵扣进项税
  • 阿里巴巴新任董事长叶
  • 植物售卖
  • 2020年扶贫拨款
  • 费用报销如何做账务处理分录
  • 可供出售金融资产和交易性金融资产
  • 销售产品收取的价款
  • 电信电子发票什么格式
  • 事业单位工会经费不足怎么办
  • 包工包料成本比例
  • 商业银行存款业务规则
  • 删除sql server2019
  • CentOS 7中安装mysql server的步骤分享
  • SQL Transcation的一些总结分享
  • mysql error1418
  • suse 10.3 安装http apche2时遇到的rpm依赖问题的解决方法
  • centos7 ethtool
  • vim wqa
  • win10预览版
  • win10地图不显示
  • 宽带连接错误628win10
  • jquery实战
  • 如何在linux安装软件
  • shell脚本实现输出字母个数大于5的单词
  • node.js怎么搭建服务器
  • linux包含
  • 一波JavaScript日期判断脚本分享
  • css回到页面顶部
  • js获取表单元素
  • shell脚本 \r
  • NGUI 响应touchscript 的 tuio动作
  • javascript查看数据类型
  • jquery的children方法
  • unity改vs版本
  • python设计gui
  • js arrayfrom
  • ApplicationId与PackageName的区别
  • 没工作个人所得税怎么交
  • 为什么专利转让要交税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设