位置: 编程技术 - 正文

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

  • 小规模企业需要交哪些税
  • 个税手续费返还要交增值税吗
  • 销售不动产税率9%还是5%
  • 不付加工费怎么办
  • 速动比率和流动比率下降说明什么
  • 个人所得税申报成功,会显示什么?
  • 增值税是先交税还是先开票
  • 企业租车费可以抵扣吗
  • 烟酒销售公司要交哪些税
  • 无形资产进项税计入成本吗?
  • 土地增值税四级税率表
  • 金税盘新领的发票怎么分发出去
  • 怎么确认权益性投资收益收入?
  • 公司帮个人代缴社保会计分录
  • 收取施工队管理费
  • 抵债资产会计核算办法
  • 公司税务风险怎么解决
  • 利率怎么算的计算方
  • 银行承兑汇票贴现流程
  • 承兑交单是什么的一种
  • 报销费用多付会计分录
  • 新版win10任务栏
  • 支付汽车耗材费怎么入账
  • 如何做好税收风险管理工作
  • php中如何获取数组的长度
  • 餐饮类发票
  • 会计差错及账项调整
  • 暂无支付能力的原因
  • 微信小程序 h5页面打不开
  • 加计扣除账务处理
  • 老生常谈的常是什么意思
  • 材料成本差异怎么结转
  • 微信公众号的推送
  • 工资费用核算
  • 货物运输业增值税
  • 购买方销项负数发票怎么抵扣
  • 税前扣除项目主要包括
  • 建筑工程维修费占总费用多少
  • 应付帐款借方余额,但对方公司己注销
  • 应收账款周转速度快表明
  • 如何计算生产费用
  • 报废产品账务的处理方法
  • 小规模印花税有减免政策吗
  • 跨年的施工项目成本
  • 出售固定资产怎样报增值税申报表
  • 企业利润总额计算例题及答案
  • 购买材料预付定金填什么凭证
  • 子公司向母公司借钱
  • 水果销售公司怎么起名字好听
  • 年末坏账准备计提余额减少说明什么
  • 工资薪金个人所得税怎么申报
  • 新成立公司怎么办理社保开户
  • mysql Sort aborted: Out of sort memory, consider increasing server sort buffer size的解决方法
  • sql存储过程什么意思
  • mysql 5.7.18 zip版安装配置方法图文教程(win7)
  • mysql 5.7启动
  • dropbox app
  • win10假死的原因
  • win8 防火墙
  • 怎样让xp系统变得更加流畅
  • linux tracker
  • hpm是什么格式的文件
  • 苹果的mac怎么查
  • service5.exe - service5是什么进程 有什么用
  • linux系统中在给定文件中查找与设定条件
  • win8怎么进去安全系统
  • linux 操作指令
  • jquery表单验证代码
  • python的步骤
  • java的gui框架
  • javascript几种类型
  • 批处理作用
  • 可视化gradcam
  • unity5.x游戏开发指南
  • js中onmouseover
  • 遮罩有什么作用
  • python文件操作方法
  • 代码实现死锁
  • 平谷大集时间表2022
  • 企业代扣代缴个人所得税怎么算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设