Android水平翻页列表,类似水平GridVIew

  Android水平翻页列表,类似于水平方向的GridView,行列自定义,但要翻页切换,考虑加载性能,当Item数据很多时加载和翻页要流畅,翻页时要有动画效果,效果图如下:

实现方式:

1:翻页可用ViewPager来做,每页内多行排列Item,考虑到翻页切换数据和加载的速度不能嵌套GridView,直接使用View来显示。

2:缓存被ViewPager销毁的View,以此来提高当数据量很大时的系统资源消耗问题。

代码实现如下:

1:编写一个PagerAdapter类,用来给ViewPager适配数据,默认情况下ViewPager会缓存相邻两页面的View,我们定义一个List<View>用来缓存被destroy后的view,当ViewPager需要实例化一个新View用来显示时,判断是否有缓存的View,如果有则拿出来使用,如果没有实例化一个新的view,写一个Item的布局文件,这里每页面10个,通过ViewHolder来处理各小Item,每次实例化新的页面时给view设置当前页10个item的数据(从List中获得,判断当前页需要显示的position,从List中取出相应的数据,最后一页显示不完的地方留空)。具体实现代码如下:

/**
 * @author Homgwu
 */
public class MainViewPagerAdapter extends PagerAdapter implements OnClickListener {
    private List<ItemEntity> singerList = new ArrayList<ItemEntity>();
    private Context mContext;
    private int pagerCount = 0;
    /**
     * 用来缓存被viewpager destroy掉的view,以便重复使用
     */
    private List<View> cacheViews = new ArrayList<View>();
    private LayoutInflater mInflater;
    // private static final int TAG_VIEWHOLDER = 1;
    // private static final int TAG_ITEMDATA = 2;
    /**
     * 一页内的item个数
     */
    private double itemInCount = 10.0;

    public MainViewPagerAdapter(List<ItemEntity> itemList, Context mContext) {
        super();
        this.singerList = itemList;
        this.mContext = mContext;
        pagerCount = (int) Math.ceil(itemList.size() / itemInCount);
        mInflater = LayoutInflater.from(this.mContext);
    }

    public void updateData(List<ItemEntity> singerList) {
        this.singerList = singerList;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return pagerCount;
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == arg1;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        View view = (View) object;
        ((ViewPager) container).removeView(view);
        //隐藏页面内的item
        clearViewContent((ViewHolder) view.getTag());
        //添加到缓存
        cacheViews.add(view);
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view = null;
        ViewHolder viewHolder = null;
        //没有缓存的view时新建一个用来显示
        if (cacheViews.isEmpty()) {
            view = mInflater.inflate(R.layout.viewpager_item,
                    container, false);
            viewHolder = new ViewHolder(view);
            view.setTag(viewHolder);
        } else {
            //有缓存的view时取出使用
            view = cacheViews.remove(0);
            viewHolder = (ViewHolder) view.getTag();
        }
        //设置页面内的各item
        initItemData(viewHolder, view, position);
        container.addView(view);
        return view;
    }

    private void initItemData(ViewHolder viewHolder, View view, int position) {
        int totalInItemCount = singerList.size();
        //每页显示10个item
        for (int i = 0; i < 10; i++) {
            //计算当前页要显示的item在arraylist中的position。
            int inItemPosition = position * 10 + i;
            //如果最后一页显示不满时跳出循环,后面的item不再显示
            if (inItemPosition >= totalInItemCount) {
                break;
            }
            ItemEntity itemEntity = singerList.get(inItemPosition);
            switch (i) {
                case 0:
                    viewHolder.bgIV1
                            .setBackgroundResource(R.mipmap.item_bg);
                    viewHolder.titleTV1.setText(itemEntity.name);
                    viewHolder.itemRL1.setVisibility(View.VISIBLE);
                    viewHolder.itemRL1.setTag(itemEntity);
                    viewHolder.itemRL1.setOnClickListener(this);
                    break;
                case 1:
                    viewHolder.bgIV2
                            .setBackgroundResource(R.mipmap.item_bg);
                    viewHolder.titleTV2.setText(itemEntity.name);
                    viewHolder.itemRL2.setVisibility(View.VISIBLE);
                    viewHolder.itemRL2.setTag(itemEntity);
                    viewHolder.itemRL2.setOnClickListener(this);
                    break;
                case 2:
                    viewHolder.bgIV3
                            .setBackgroundResource(R.mipmap.item_bg);
                    viewHolder.titleTV3.setText(itemEntity.name);
                    viewHolder.itemRL3.setVisibility(View.VISIBLE);
                    viewHolder.itemRL3.setTag(itemEntity);
                    viewHolder.itemRL3.setOnClickListener(this);
                    break;
                case 3:
                    viewHolder.bgIV4
                            .setBackgroundResource(R.mipmap.item_bg);
                    viewHolder.titleTV4.setText(itemEntity.name);
                    viewHolder.itemRL4.setVisibility(View.VISIBLE);
                    viewHolder.itemRL4.setTag(itemEntity);
                    viewHolder.itemRL4.setOnClickListener(this);
                    break;
                case 4:
                    viewHolder.bgIV5
                            .setBackgroundResource(R.mipmap.item_bg);
                    viewHolder.titleTV5.setText(itemEntity.name);
                    viewHolder.itemRL5.setVisibility(View.VISIBLE);
                    viewHolder.itemRL5.setTag(itemEntity);
                    viewHolder.itemRL5.setOnClickListener(this);
                    break;
                case 5:
                    viewHolder.bgIV6
                            .setBackgroundResource(R.mipmap.item_bg);
                    viewHolder.titleTV6.setText(itemEntity.name);
                    viewHolder.itemRL6.setVisibility(View.VISIBLE);
                    viewHolder.itemRL6.setTag(itemEntity);
                    viewHolder.itemRL6.setOnClickListener(this);
                    break;
                case 6:
                    viewHolder.bgIV7
                            .setBackgroundResource(R.mipmap.item_bg);
                    viewHolder.titleTV7.setText(itemEntity.name);
                    viewHolder.itemRL7.setVisibility(View.VISIBLE);
                    viewHolder.itemRL7.setTag(itemEntity);
                    viewHolder.itemRL7.setOnClickListener(this);
                    break;
                case 7:
                    viewHolder.bgIV8
                            .setBackgroundResource(R.mipmap.item_bg);
                    viewHolder.titleTV8.setText(itemEntity.name);
                    viewHolder.itemRL8.setVisibility(View.VISIBLE);
                    viewHolder.itemRL8.setTag(itemEntity);
                    viewHolder.itemRL8.setOnClickListener(this);
                    break;
                case 8:
                    viewHolder.bgIV9
                            .setBackgroundResource(R.mipmap.item_bg);
                    viewHolder.titleTV9.setText(itemEntity.name);
                    viewHolder.itemRL9.setVisibility(View.VISIBLE);
                    viewHolder.itemRL9.setTag(itemEntity);
                    viewHolder.itemRL9.setOnClickListener(this);
                    break;
                case 9:
                    viewHolder.bgIV10
                            .setBackgroundResource(R.mipmap.item_bg);
                    viewHolder.titleTV10.setText(itemEntity.name);
                    viewHolder.itemRL10.setVisibility(View.VISIBLE);
                    viewHolder.itemRL10.setTag(itemEntity);
                    viewHolder.itemRL10.setOnClickListener(this);
                    break;
                default:
                    break;
            }
        }
    }

    /**
     * 隐藏各item
     * @param viewHolder
     */
    private void clearViewContent(ViewHolder viewHolder) {
        viewHolder.itemRL1.setVisibility(View.GONE);
        viewHolder.itemRL2.setVisibility(View.GONE);
        viewHolder.itemRL3.setVisibility(View.GONE);
        viewHolder.itemRL4.setVisibility(View.GONE);
        viewHolder.itemRL5.setVisibility(View.GONE);
        viewHolder.itemRL6.setVisibility(View.GONE);
        viewHolder.itemRL7.setVisibility(View.GONE);
        viewHolder.itemRL8.setVisibility(View.GONE);
        viewHolder.itemRL9.setVisibility(View.GONE);
        viewHolder.itemRL10.setVisibility(View.GONE);
    }

    @Override
    public void onClick(View arg0) {
        //点击到对应item
        ItemEntity itemEntity = (ItemEntity) arg0.getTag();
        Toast.makeText(mContext, itemEntity.name, Toast.LENGTH_SHORT).show();
    }

    /**
     * viewHolder
     */
    static class ViewHolder {
        public ImageView bgIV1, bgIV2, bgIV3, bgIV4, bgIV5, bgIV6, bgIV7,
                bgIV8, bgIV9, bgIV10;
        public TextView titleTV1, titleTV2, titleTV3, titleTV4, titleTV5,
                titleTV6, titleTV7, titleTV8, titleTV9, titleTV10;
        public RelativeLayout itemRL1, itemRL2, itemRL3, itemRL4, itemRL5,
                itemRL6, itemRL7, itemRL8, itemRL9, itemRL10;

        public ViewHolder(View itemView) {
            bgIV1 = (ImageView) itemView
                    .findViewById(R.id.fragment_music_singer_item_image_iv_one);
            titleTV1 = (TextView) itemView
                    .findViewById(R.id.fragment_music_singer_item_name_tv_one);
            bgIV2 = (ImageView) itemView
                    .findViewById(R.id.fragment_music_singer_item_image_iv_two);
            titleTV2 = (TextView) itemView
                    .findViewById(R.id.fragment_music_singer_item_name_tv_two);
            bgIV3 = (ImageView) itemView
                    .findViewById(R.id.fragment_music_singer_item_image_iv_three);
            titleTV3 = (TextView) itemView
                    .findViewById(R.id.fragment_music_singer_item_name_tv_three);
            bgIV4 = (ImageView) itemView
                    .findViewById(R.id.fragment_music_singer_item_image_iv_four);
            titleTV4 = (TextView) itemView
                    .findViewById(R.id.fragment_music_singer_item_name_tv_four);
            bgIV5 = (ImageView) itemView
                    .findViewById(R.id.fragment_music_singer_item_image_iv_five);
            titleTV5 = (TextView) itemView
                    .findViewById(R.id.fragment_music_singer_item_name_tv_five);
            bgIV6 = (ImageView) itemView
                    .findViewById(R.id.fragment_music_singer_item_image_iv_six);
            titleTV6 = (TextView) itemView
                    .findViewById(R.id.fragment_music_singer_item_name_tv_six);
            bgIV7 = (ImageView) itemView
                    .findViewById(R.id.fragment_music_singer_item_image_iv_seven);
            titleTV7 = (TextView) itemView
                    .findViewById(R.id.fragment_music_singer_item_name_tv_seven);
            bgIV8 = (ImageView) itemView
                    .findViewById(R.id.fragment_music_singer_item_image_iv_eight);
            titleTV8 = (TextView) itemView
                    .findViewById(R.id.fragment_music_singer_item_name_tv_eight);
            bgIV9 = (ImageView) itemView
                    .findViewById(R.id.fragment_music_singer_item_image_iv_nine);
            titleTV9 = (TextView) itemView
                    .findViewById(R.id.fragment_music_singer_item_name_tv_nine);
            bgIV10 = (ImageView) itemView
                    .findViewById(R.id.fragment_music_singer_item_image_iv_ten);
            titleTV10 = (TextView) itemView
                    .findViewById(R.id.fragment_music_singer_item_name_tv_ten);
            itemRL1 = (RelativeLayout) itemView
                    .findViewById(R.id.fragment_music_singer_item_one);
            itemRL2 = (RelativeLayout) itemView
                    .findViewById(R.id.fragment_music_singer_item_two);
            itemRL3 = (RelativeLayout) itemView
                    .findViewById(R.id.fragment_music_singer_item_three);
            itemRL4 = (RelativeLayout) itemView
                    .findViewById(R.id.fragment_music_singer_item_four);
            itemRL5 = (RelativeLayout) itemView
                    .findViewById(R.id.fragment_music_singer_item_five);
            itemRL6 = (RelativeLayout) itemView
                    .findViewById(R.id.fragment_music_singer_item_six);
            itemRL7 = (RelativeLayout) itemView
                    .findViewById(R.id.fragment_music_singer_item_seven);
            itemRL8 = (RelativeLayout) itemView
                    .findViewById(R.id.fragment_music_singer_item_eight);
            itemRL9 = (RelativeLayout) itemView
                    .findViewById(R.id.fragment_music_singer_item_nine);
            itemRL10 = (RelativeLayout) itemView
                    .findViewById(R.id.fragment_music_singer_item_ten);
        }
    }

}

2:ViewPager使用:

/**
 * @author Homgwu
 */
public class MainActivity extends Activity {

    private ViewPager mViewPager;
    private MainViewPagerAdapter mViewPagerAdapter;
    private List<ItemEntity> mItemEntityList=new ArrayList<ItemEntity>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView(){
        mViewPager= (ViewPager) findViewById(R.id.main_vp);
        initData();
        mViewPagerAdapter=new MainViewPagerAdapter(mItemEntityList,this);
        //设置翻页动画
        mViewPager.setPageTransformer(true,new DepthPageTransformer());
        mViewPager.setAdapter(mViewPagerAdapter);
    }

    /**
     * 初始化数据
     */
    private void initData(){
        for (int i=0;i<104;i++){
            ItemEntity itemEntity=new ItemEntity();
            itemEntity.name="Android"+i;
            mItemEntityList.add(itemEntity);
        }
    }

}

3:动画代码:

public class DepthPageTransformer implements PageTransformer {
    private static float MIN_SCALE = 0.5f;

    /**
     * position参数指明给定页面相对于屏幕中心的位置。它是一个动态属性,会随着页面的滚动而改变。当一个页面填充整个屏幕是,它的值是0,
     * 当一个页面刚刚离开屏幕的右边时
     * ,它的值是1。当两个也页面分别滚动到一半时,其中一个页面的位置是-0.5,另一个页面的位置是0.5。基于屏幕上页面的位置
     * ,通过使用诸如setAlpha()、setTranslationX()、或setScaleY()方法来设置页面的属性,来创建自定义的滑动动画。
     */
    @Override
    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();
        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);
            view.setTranslationX(0);
        } else if (position <= 0) { // [-1,0]
            // Use the default slide transition when
            // moving to the left page
            view.setAlpha(1);
            view.setTranslationX(0);
            view.setScaleX(1);
            view.setScaleY(1);
        } else if (position <= 1) { // (0,1]
            // Fade the page out.
            view.setAlpha(1 - position);
            // Counteract the default slide transition
            view.setTranslationX(pageWidth * -position);
            // Scale the page down (between MIN_SCALE and 1)
            float scaleFactor = MIN_SCALE + (1 - MIN_SCALE)
                    * (1 - Math.abs(position));
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);
        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
            view.setScaleX(1);
            view.setScaleY(1);
        }
    }

}

完整Sample可以到如下地址下载:

1:http://download.csdn.net/detail/homg92/8584445

2:https://github.com/fightmancn/horizontalfliplist

时间: 2024-10-25 04:58:59

Android水平翻页列表,类似水平GridVIew的相关文章

Android书籍翻页效果需要用到的文件

模仿此效果,只需要 导入一下文件即可 :BookActivity.java,BookPageFactory.java,PageWidget.java package com.andorid.shu.love; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.c

android开发教程:android手势翻页效果

听麦子学院android开发老师说要实现手势翻页效果,主要用到ViewFlipper和GestureDetector.  ViewFlipper变化当前显示内容,GestureDetector监听手势.  用于多页的展示非常酷.  现在我就给大家简单说明下,  首先创建工程:TestFlip,创建主Activity:TestFlip.  在res/layout/main.xml中添加flipper信息,如下:  Java代码   1. <?xml version="1.0" en

android 左右翻页

布局: <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" 

前端实现类似于iBooks的图书翻页效果的网络阅读软件(一)

昨天晚上在群里交流各种脑动大开的题目,我顺手也提了一个问题: JS如何做“字符分页“ 原意是源于我4年前公司项目,我负责开发1年的样子,后来各种原因就没有然后了… http://reader.appcarrier.com/     以上图片是手机上的截图,Metro风格当前可是风靡一时,软件本身是类似现在的”追书神器” 通过书名,在网络上搜索到对应的内容,之后保存到本地数据库.在通过JS获取数据再处理 自己装好测了下,貌似下载服务器已经挂了~ 程序采用PhoneGap打包的,数据采集是用底层完成

jQuery支持mobile的全屏水平横向翻页效果

这是一款支持移动手机mobile设备的jQuery全屏水平横向翻页效果插件.该翻页插件可以使页面在水平方向上左右全屏翻动,它支持手机触摸屏,支持使用鼠标滚动页面. 整个页面过渡平滑,效果非常不错. 在线演示:http://www.htmleaf.com/Demo/201503141519.html 下载地址:http://www.htmleaf.com/jQuery/Layout-Interface/201503141518.html

Android 自定义view 折线翻页

看了Aige的 Android翻页效果原理实现之引入折线 有些计算原理 在此留个笔记 x.y 为 折出的三角形的 短边与长边; O(a,b)点即为触摸点 设K = w - a, L = h - b ?OMA中,由勾股定理,得出 ?OMA与 ?AOB.?APB三者之面积和 等于 梯形 MOBP的面积 代入x,解得 再代入触摸点(a,b) 即可求出当前对应的x.y了 有x.y现在就可以求出A点和B点的坐标了 A点(w - x, h) B点(w, h - y) 折线出的三角形即是:以Path的move

Android 聊天表情输入、表情翻页带效果、下拉刷新聊天记录

经过一个星期的折腾,终于做完了这个Android 聊天表情输入.表情翻页带效果.下拉刷新聊天记录.这只是一个单独聊天表情的输入,以及聊天的效果实现.因为我没有写服务器,所以没有双方聊天的效果.主要是聊天中表情的选择,发送.表情翻页带有不同的效果.我在主要代码中都写了注释.下面看代码实现.附上本文源码,代码较多. 下载地址:点击 一.先看实现的效果图 二.调用接口以及设置MainActivity package com.example.activity; import java.util.Arra

★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import COM.Example.Main.R; import COM.Example.Main.stringG

Android UI【android 仿微信、QQ聊天,带表情,可翻页,带翻页拖动缓冲】

http://blog.csdn.net/lnb333666/article/details/8546497 如题,这是公司项目的一个功能模块,先上个效果图: 其次大致说说原理: 1,首先判断输入的字符,是否包含表情的文字,比如   这个表情对应的文件名为 emoji_1.png,它对应的文字描述 :[可爱],如果我们在输出的是输出这么一句话:老婆,我想你了.  那么我们对应的根本文字就是:老婆,我想你了[可爱]. 2,具体的转换过程就是用正则表达式比配文字中是否含有[xxx]这类的文字,如果有