zoukankan      html  css  js  c++  java
  • 自定义左右滑动图片列表

    xml引用

    代码初始化

    控件代码

    package com.feilu.investadviser.ui.main.widget;
    
    import android.content.Context;
    import android.graphics.Color;
    import android.util.AttributeSet;
    import android.util.DisplayMetrics;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.WindowManager;
    import android.widget.HorizontalScrollView;
    import android.widget.LinearLayout;
    
    import com.feilu.investadviser.ui.main.adapter.HorizontalScrollViewAdapter;
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    public class HzScrollView extends HorizontalScrollView implements View.OnClickListener {
    
        /**
         * 图片滚动时的回调接口
         *
         */
        public interface CurrentImageChangeListener {
            void onCurrentImgChanged(int position, View viewIndicator);
        }
    
        /**
         * 条目点击时的回调
         *
         */
        public interface OnItemClickListener {
            void onClick(View view, int pos);
        }
    
        private CurrentImageChangeListener mListener;
    
        private OnItemClickListener mOnClickListener;
    
        private static final String TAG = "HzScrollView";
    
        /**
         * HorizontalListView中的LinearLayout
         */
        private LinearLayout mContainer;
        /**
         * 子元素的宽度
         */
        private int mChildWidth;
        /**
         * 子元素的高度
         */
        private int mChildHeight;
        /**
         * 当前最后一张图片的index
         */
        private int mCurrentIndex;
        /**
         * 当前第一张图片的下标
         */
        private int mFristIndex;
        /**
         * 当前第一个View
         */
        private View mFirstView;
        /**
         * 数据适配器
         */
        private HorizontalScrollViewAdapter mAdapter;
        /**
         * 每屏幕最多显示的个数
         */
        private int mCountOneScreen;
        /**
         * 屏幕的宽度
         */
        private int mScreenWitdh;
    
        /**
         * 保存View与位置的键值对
         */
        private Map<View, Integer> mViewPos = new HashMap<View, Integer>();
    
        public HzScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
            // 获得屏幕宽度
            WindowManager wm = (WindowManager) context
                    .getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics outMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(outMetrics);
            mScreenWitdh = outMetrics.widthPixels;
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            mContainer = (LinearLayout) getChildAt(0);
        }
    
        /**
         * 加载下一张图片
         */
        protected void loadNextImg() {
            // 数组边界值计算
            if (mCurrentIndex == mAdapter.getCount() - 1) {
                return;
            }
            // 移除第一张图片,且将水平滚动位置置0
            scrollTo(0, 0);
            mViewPos.remove(mContainer.getChildAt(0));
            mContainer.removeViewAt(0);
    
            // 获取下一张图片,并且设置onclick事件,且加入容器中
            View view = mAdapter.getView(++mCurrentIndex, null, mContainer);
            view.setOnClickListener(this);
            mContainer.addView(view);
            mViewPos.put(view, mCurrentIndex);
    
            // 当前第一张图片小标
            mFristIndex++;
            // 如果设置了滚动监听则触发
            if (mListener != null) {
                notifyCurrentImgChanged();
            }
    
        }
    
        /**
         * 加载前一张图片
         */
        protected void loadPreImg() {
            // 如果当前已经是第一张,则返回
            if (mFristIndex == 0)
                return;
            // 获得当前应该显示为第一张图片的下标
            int index = mCurrentIndex - mCountOneScreen;
            if (index >= 0) {
                // mContainer = (LinearLayout) getChildAt(0);
                // 移除最后一张
                int oldViewPos = mContainer.getChildCount() - 1;
                mViewPos.remove(mContainer.getChildAt(oldViewPos));
                mContainer.removeViewAt(oldViewPos);
    
                // 将此View放入第一个位置
                View view = mAdapter.getView(index, null, mContainer);
                mViewPos.put(view, index);
                mContainer.addView(view, 0);
                view.setOnClickListener(this);
                // 水平滚动位置向左移动view的宽度个像素
                scrollTo(mChildWidth, 0);
                // 当前位置--,当前第一个显示的下标--
                mCurrentIndex--;
                mFristIndex--;
                // 回调
                if (mListener != null) {
                    notifyCurrentImgChanged();
    
                }
            }
        }
    
        /**
         * 滑动时的回调
         */
        public void notifyCurrentImgChanged() {
            // 先清除所有的背景色,点击时会设置为蓝色
            for (int i = 0; i < mContainer.getChildCount(); i++) {
                mContainer.getChildAt(i).setBackgroundColor(Color.WHITE);
            }
    
            mListener.onCurrentImgChanged(mFristIndex, mContainer.getChildAt(0));
    
        }
    
        /**
         * 初始化数据,设置数据适配器
         *
         */
        public void initDatas(HorizontalScrollViewAdapter mAdapter) {
            this.mAdapter = mAdapter;
            mContainer = (LinearLayout) getChildAt(0);
            // 获得适配器中第一个View
            final View view = mAdapter.getView(0, null, mContainer);
            mContainer.addView(view);
    
            // 强制计算当前View的宽和高
            if (mChildWidth == 0 && mChildHeight == 0) {
                int w = View.MeasureSpec.makeMeasureSpec(0,
                        View.MeasureSpec.UNSPECIFIED);
                int h = View.MeasureSpec.makeMeasureSpec(0,
                        View.MeasureSpec.UNSPECIFIED);
                view.measure(w, h);
                mChildHeight = view.getMeasuredHeight();
                mChildWidth = view.getMeasuredWidth();
                Log.e(TAG, view.getMeasuredWidth() + "," + view.getMeasuredHeight());
                mChildHeight = view.getMeasuredHeight();
                // 计算每次加载多少个View
                mCountOneScreen = mScreenWitdh / mChildWidth + 2;
    
                Log.e(TAG, "mCountOneScreen = " + mCountOneScreen
                        + " ,mChildWidth = " + mChildWidth);
    
            }
            // 初始化第一屏幕的元素
            initFirstScreenChildren(mAdapter.getCount());
        }
    
        /**
         * 加载第一屏的View
         *
         * @param mCountOneScreen
         */
        public void initFirstScreenChildren(int mCountOneScreen) {
            mContainer = (LinearLayout) getChildAt(0);
            mContainer.removeAllViews();
            mViewPos.clear();
    
            for (int i = 0; i < mCountOneScreen; i++) {
                View view = mAdapter.getView(i, null, mContainer);
                view.setOnClickListener(this);
                mContainer.addView(view);
                mViewPos.put(view, i);
                mCurrentIndex = i;
            }
    
            if (mListener != null) {
                notifyCurrentImgChanged();
            }
    
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            switch (ev.getAction()) {
                case MotionEvent.ACTION_MOVE:
                    // Log.e(TAG, getScrollX() + "");
    
                    int scrollX = getScrollX();
                    // 如果当前scrollX为view的宽度,加载下一张,移除第一张
                    if (scrollX >= mChildWidth) {
                        loadNextImg();
                    }
                    // 如果当前scrollX = 0, 往前设置一张,移除最后一张
                    if (scrollX == 0) {
                        loadPreImg();
                    }
                    break;
            }
            return super.onTouchEvent(ev);
        }
    
        @Override
        public void onClick(View v) {
            if (mOnClickListener != null) {
                for (int i = 0; i < mContainer.getChildCount(); i++) {
                    mContainer.getChildAt(i).setBackgroundColor(Color.WHITE);
                }
                mOnClickListener.onClick(v, mViewPos.get(v));
            }
        }
    
        public void setOnItemClickListener(OnItemClickListener mOnClickListener) {
            this.mOnClickListener = mOnClickListener;
        }
    
        public void setCurrentImageChangeListener(
                CurrentImageChangeListener mListener) {
            this.mListener = mListener;
        }
    
    }
    View Code

    adapter

    package com.feilu.investadviser.ui.main.adapter;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.feilu.investadviser.R;
    import com.feilu.investadviser.ui.main.bean.RanksRenQiEntity;
    
    import java.util.List;
    
    public class HorizontalScrollViewAdapter {
    
        private Context context;
        private LayoutInflater mInflater;
        private List<RanksRenQiEntity.DataBean> mDatas;
    
        public HorizontalScrollViewAdapter(Context context, List<RanksRenQiEntity.DataBean> mDatas) {
            this.context = context;
            mInflater = LayoutInflater.from(context);
            this.mDatas = mDatas;
        }
    
        public int getCount() {
            return mDatas.size();
        }
    
        public RanksRenQiEntity.DataBean getItem(int position) {
            return mDatas.get(position);
        }
    
        public long getItemId(int position) {
            return position;
        }
    
        public void setList(List<RanksRenQiEntity.DataBean> mDatas){
            this.mDatas.clear();
            this.mDatas.addAll(mDatas);
        }
    
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.item_ranks_scroll,
                        parent, false);
    //            holder.mImg = (ImageView) convertView.findViewById(R.id.img);
    //            holder.del = (ImageView) convertView.findViewById(R.id.del);
    
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
    
            return convertView;
        }
    
        static class ViewHolder {
    
        }
    
    }
    View Code
  • 相关阅读:
    复制出一个同样的窗体
    DBEdit的OnChange事件(100分)
    delphi中DBEdit,数据的修改和提交
    delphi 根据DELTA自动生成SQL语句
    clientdataset生成sql
    在delphi中生成GUID/自动获取临时表名......
    如何得到表的主键名称(字段名称)
    通用的更新方法 THlsImplBase
    Delphi中ClientDataSet的用法小结
    ORACLE 字符串补零
  • 原文地址:https://www.cnblogs.com/LiuZhen/p/3586026.html
Copyright © 2011-2022 走看看