位置: 编程技术 - 正文

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

  • 个人所得税查询工资与实际工资不符是为何
  • 银行承兑的商业汇票计入什么科目
  • 工会经费与残保金的取数是一致吗
  • 分公司亏损总公司怎么办
  • 个体工商户税收标准2023年
  • 发票与入库单明细不一致税务可以吗
  • 小规模公司缴税以后公转私
  • 如何进行无形资产核算
  • 差额征税的财税处理怎么做?
  • 少数股东权益如何保障
  • 二手机械设备买卖合同
  • 建筑企业小规模纳税标准
  • 失控发票进项税额转出申报表填写
  • 湖北省教育费附加和地方教育费附加减免
  • 杨志勇财政
  • 商票背书需要对方开发票吗
  • 租赁合同印花税怎么交,一年一次吗
  • 差额发票如何缴纳增值税
  • mac怎么创建热点
  • 销售推广的常用形式
  • mac文本文件
  • 科技研发公司经营范围包括哪些
  • 优先股分类为金融负债
  • PHP:curl_multi_close()的用法_cURL函数
  • 违约金开什么票据
  • 常见造成账目差异的原因
  • php遍历结果集
  • 中医诊所的税收分类编码
  • java项目报错
  • php用户登录界面
  • js查找数组所有符合条件数据
  • 成本核算流程及注意事项
  • rsync连接
  • 出口退税管理类别四类
  • 百旺金赋开票系统客服电话
  • php会员系统
  • 关于帝国战争的游戏
  • 非营利组织免征企业所得税的通知
  • Windows7下Microsoft SQL Server 2008安装图解和注意事项
  • mysql load local
  • 收到银行承兑汇票的账务处理
  • 突然收到电子退库收入
  • 机会成本的特点有()
  • 以前年度未处理往来账怎么叫
  • 跨年发票应该如何处理
  • 免抵退账务处理流程
  • 视同销售的账务处理如何做?
  • 赠送的商品如何入账
  • 固定资产更新改造被替换的旧部件残值收入
  • 小规模纳税人公司注册条件
  • 什么差旅费
  • 营业外收入适用的会计准则
  • 员工垫付的钱会计分录
  • 飞机发票和行程单一样吗
  • 报关单填制的运费怎么算
  • 上年亏损本年要交税吗
  • 建筑业营改增后,人工费不存在可抵扣
  • mysql查看查询耗时
  • sql server如何使用
  • freebsd10安装教程
  • win7系统如何彻底删除xp
  • win1909版本
  • xp系统禁用网络连接
  • linux中dhcp
  • centos 6.5网络设置
  • win7某个软件打不开
  • win10安装grads
  • linux如何直接访问gpio不用设备树
  • dosbox批处理
  • 慎用小儿百部止咳糖浆
  • 深入了解是啥意思
  • javascript开发平台
  • javascript选项
  • js如何封装
  • java模拟支付功能
  • javascript面向对象精要pdf下载
  • python写监控脚本
  • ukey开票人是管理员改胃自己时只能开电子发票
  • 重庆市网上税务局官网app下载
  • 广东省电子税务局登录方式
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设