Android编程实现ListView头部ViewPager广告轮询图效果

本文实例讲述了Android编程实现ListView头部ViewPager广告轮询图效果。分享给大家供大家参考,具体如下:

之前看了别人的一些软件,发现其广告图轮询的时候,那个广告感觉和ViewPager的效果不太一样,后来也查了一下,是因为时间问题,找了一些资料,自己也实践一下。

1、为了解决ListView头部加ViewPager滑动冲突问题,必须自定义ListView,重写里面的onInterceptTouchEvent方法,ListView代码如下:

package com.example.testa;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView;
public class DefinedListView extends ListView {
 public DefinedListView(Context context) {
  super(context);
 }
 public DefinedListView(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 public DefinedListView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 }
 private float xDistance, yDistance, xLast, yLast;
 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
  switch (ev.getAction()) {
   case MotionEvent.ACTION_DOWN:
    xDistance = yDistance = 0f;
    xLast = ev.getX();
    yLast = ev.getY();
    break;
   case MotionEvent.ACTION_MOVE:
    final float curX = ev.getX();
    final float curY = ev.getY();
    xDistance += Math.abs(curX - xLast);
    yDistance += Math.abs(curY - yLast);
    xLast = curX;
    yLast = curY;
    if (xDistance > yDistance) {
     return false;
    }
  }
  return super.onInterceptTouchEvent(ev);
 }
}

2、为了让广告轮询的速度减慢,必须重新设置ViewPager的Scroller,自定义的Scroller如下:

package com.example.testa;
import java.lang.reflect.Field;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.Interpolator;
import android.widget.Scroller;
public class DefinedScroller extends Scroller {
 private int DURATION_TIME = 1000;
 private boolean shouldAutoScroll = true;
 private ViewPager viewPager = null;
 @SuppressLint("HandlerLeak")
 private final Handler handler = new Handler() {
  public void handleMessage(android.os.Message msg) {
   if (shouldAutoScroll) {
    viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
    handler.sendEmptyMessageDelayed(0, 2000);
   }
  };
 };
 public DefinedScroller(Context context) {
  super(context);
 }
 public DefinedScroller(Context context, Interpolator interpolator) {
  super(context, interpolator);
 }
 private View initViewPager(Context context) {
  View view = LayoutInflater.from(context).inflate(R.layout.view_pager_layout, null);
  this.viewPager = (ViewPager) view.findViewById(R.id.viewpager);
  this.viewPager.setOffscreenPageLimit(2);
  this.viewPager.setAdapter(new MyFragmentPagerAdapter(((FragmentActivity) context).getSupportFragmentManager()));
  return view;
 }
 public ViewPager getViewPager() {
  return viewPager;
 }
 public View initView(Context context) {
  View view = initViewPager(context);
  this.viewPager.setOnTouchListener(new OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
     shouldAutoScroll = true;
     handler.sendEmptyMessageDelayed(0, 2000);
    } else {
     handler.removeMessages(0);
     shouldAutoScroll = false;
    }
    return false;
   }
  });
  try {
   Field mScroller = ViewPager.class.getDeclaredField("mScroller");
   mScroller.setAccessible(true);
   mScroller.set(viewPager, this);
  } catch (NoSuchFieldException e) {
  } catch (IllegalArgumentException e) {
  } catch (IllegalAccessException e) {
  }
  handler.sendEmptyMessageDelayed(0, 2000);
  return view;
 }
 public void setShouldAutoScroll() {
  handler.removeMessages(0);
  if (viewPager.isShown()) {
   shouldAutoScroll = true;
   handler.sendEmptyMessageDelayed(0, 2000);
  } else {
   shouldAutoScroll = false;
  }
 }
 @Override
 public void startScroll(int startX, int startY, int dx, int dy, int duration) {
  super.startScroll(startX, startY, dx, dy, shouldAutoScroll ? DURATION_TIME : duration);
 }
}

关键是startScroll方法啦

3、其他测试类,

(1)TestFragment:

package com.example.testa;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
public class TestFragment extends Fragment {
 public int imageResource = 0;
 public static TestFragment newInstance(int imageResource) {
  TestFragment newFragment = new TestFragment();
  newFragment.imageResource = imageResource;
  return newFragment;
 }
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.pager_layout, null);
  ImageView textView = (ImageView) view.findViewById(R.id.image);
  textView.setImageResource(imageResource);
  return view;
 }
}

(2)ViewPager的Adapter类:

package com.example.testa;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
 public MyFragmentPagerAdapter(FragmentManager fm) {
  super(fm);
 }
 @Override
 public int getCount() {
  return Integer.MAX_VALUE;
 }
 @Override
 public Fragment getItem(int arg0) {
  switch (arg0 % 4) {
   case 0:
    return TestFragment.newInstance(R.drawable.a1);
   case 1:
    return TestFragment.newInstance(R.drawable.default_wh);
   case 2:
    return TestFragment.newInstance(R.drawable.default_ww);
   case 3:
    return TestFragment.newInstance(R.drawable.test);
   default:
    return TestFragment.newInstance(R.drawable.a1);
  }
 }
}

(3)测试的Activity:

package com.example.testa;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MainActivity extends FragmentActivity {
 private DefinedListView listView = null;
 private List<String> list = null;
 private DefinedScroller definedScroller = null;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  listView = (DefinedListView) findViewById(R.id.listview);
  initListData();
  initViewPager();
  listView.setAdapter(new ListAdapter());
  listView.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    definedScroller.getViewPager().setCurrentItem(definedScroller.getViewPager().getCurrentItem() + 1);
   }
  });
  listView.setOnScrollListener(new OnScrollListener() {
   @Override
   public void onScrollStateChanged(AbsListView view, int scrollState) {
    if (scrollState == SCROLL_STATE_IDLE) {
     definedScroller.setShouldAutoScroll();
    }
   }
   @Override
   public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
   }
  });
 }
 private void initListData() {
  list = new ArrayList<String>();
  for (int i = 1; i <= 20; ++i) {
   list.add("test" + i);
  }
 }
 private void initViewPager() {
  definedScroller = new DefinedScroller(this);
  listView.addHeaderView(definedScroller.initView(this));
 }
 private class ListAdapter extends BaseAdapter {
  @Override
  public int getCount() {
   return list.size();
  }
  @Override
  public Object getItem(int position) {
   return list.get(position);
  }
  @Override
  public long getItemId(int position) {
   return position;
  }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
   TextView textView = (TextView) LayoutInflater.from(MainActivity.this).inflate(R.layout.text_view_layout,
     null);
   textView.setPadding(20, 20, 20, 20);
   textView.setText(list.get(position));
   return textView;
  }
 }
}

4、布局文件就算了吧

上面有些是在别的地方看到的,很久了,忘记在哪里看到的了,就写不上源地址了,敬请见谅。

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android自定义ListView实现仿QQ可拖拽列表功能

    我们大致的思路,其实是这样子的,也是我的设想,我们可以先去实现一个简单的ListView的数据,但是他的Adapter,我们可以用系统封装好的,然后传递进去一个实体类,最后自定义一个listview去操作,所以我们先把准备的工作做好,比如? list_item.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.a

  • Android ListView万能适配器实例代码

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的Adapter继承于BaseAdapter,下面是自定义的Adapter,精华在getView()方法中 package com.example.mylistview.util; import java.util.List; import android.content.Context; impor

  • Android 自定义ListView示例详解

    本文讲实现一个自定义列表的Android程序,程序将实现一个使用自定义的适配器(Adapter)绑定 数据,通过contextView.setTag绑定数据有按钮的ListView. 系统显示列表(ListView)时,首先会实例化一个适配器,本文将实例化一个自定义的适配器.实现 自定义适配器,必须手动映射数据,这时就需要重写getView()方法,系统在绘制列表的每一行的时候 将调用此方法. ListView在开始绘制的时候,系统自动调用getCount()函数,根据函数返回值得到ListVi

  • Android UI控件ExpandableListView基本用法详解

    ExpandableListView介绍  ExpandableListView的引入  ExpandableListView可以显示一个视图垂直滚动显示两级列表中的条目,这不同于列表视图(ListView).ExpandableListView允许有两个层次:一级列表中有二级列表.  比如在手机设置中,对于分类,有很好的效果.手机版QQ也是这样的效果. 使用ExpandableListView的整体思路 (1)给ExpandableListView设置适配器,那么必须先设置数据源. (2)数据

  • Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)

    ListView控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adapter的用法,加了很多的判断等等等等-.我们先来看看实现的效果吧! 好的,我们新建一个项目LvCheckBox 我们事先先把这两个布局写好吧,一个是主布局,还有一个listview的item.xml,相信不用多说 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

  • Android ListView 默认选中某一项实现代码

    这里是使用 TOC 生成的目录: •Layout文件定义 ◦ListView定义 ◦item 模板定义 •代码 ◦初始化列表 ◦用户点击处理 •效果 -------------------------------------------------------------------------------- 要使用 ListView 实现一个充值方式选择,默认想选中第二项,搞了一下午,终于搞定了.原本就没怎么用 Java 写过 Android 应用,又隔了好久没写,一切都生疏了,半吊子变成大呆

  • Android 新闻界面模拟ListView和ViewPager的应用

    模拟新闻 APP 的界面 1)写 ListView 之前先写布局: 这里有两种 Item 的布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" androi

  • Android listview与adapter详解及实例代码

    一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView就是实现这个功能的.第二点也不难做到,在后面的学习中读者会发现,这非常简单. 一个ListView的创建需要3个元素. (1)ListView中的每一列的View. (2)填入View的数据或者图片等. (3)连接数据与ListView的适配器. 也就是说,要使用ListView,首先要了解什么是适配器.适配器是一个连接数据和AdapterView(ListView就

  • Android开发中ListView自定义adapter的封装

    [引入] 我们一般编写listView的时候顺序是这样的:  •需要展示的数据集List<T>  •为这个数据集编写一个ListView  •为这个ListView编写一个Adapter,一般继承自BaseAdapter  •在BaseAdapter内部编写一个ViewHolder类,对应ListView里面的item控件,提高控件的查询效率 分析: List<T>:ListView --> Adapter extends BaseAdapter --> ViewHol

  • Android编程实现ListView头部ViewPager广告轮询图效果

    本文实例讲述了Android编程实现ListView头部ViewPager广告轮询图效果.分享给大家供大家参考,具体如下: 之前看了别人的一些软件,发现其广告图轮询的时候,那个广告感觉和ViewPager的效果不太一样,后来也查了一下,是因为时间问题,找了一些资料,自己也实践一下. 1.为了解决ListView头部加ViewPager滑动冲突问题,必须自定义ListView,重写里面的onInterceptTouchEvent方法,ListView代码如下: package com.exampl

  • Android 使用ViewPager实现轮播图效果

    写这篇文章只是对今天所学的知识进行加深印象,对ViewPager的一些处理,比如适配器和各个方法的作用等. 先看效果图 这里我是在xml中写的圆点 Drawable文件夹下的xml代码: Shape_yes.xml: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">

  • Android ViewPager实现轮播图效果

    先上一张效果图: 说到ViewPager实现轮播图效果,那么肯定会用到PagerAdapter,下面先介绍下这个类. PagerAdapter简介 PagerAdapter是Android.support.v4包中的类,是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即可使用. PagerAdapter主要是viewpager的适配器,而viewPager则也是在android.support.v4扩展包中新添加的一个强大的控件

  • Android实现ViewPage轮播图效果

    在android移动端的开发中,首页轮播图是一个特别常见的功能,所以今天就来将最近写的一个小demo记录一下. 首先当然是新建一个项目代码如下: activity_main.xml文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to

  • Android编程开发ScrollView中ViewPager无法正常滑动问题解决方法

    本文实例讲述了Android编程开发ScrollView中ViewPager无法正常滑动问题解决方法.分享给大家供大家参考,具体如下: 这里主要介绍如何解决ViewPager在ScrollView中滑动经常失效.无法正常滑动问题. 解决方法只需要在接近水平滚动时ScrollView不处理事件而交由其子View(即这里的ViewPager)处理即可,重写ScrollView的onInterceptTouchEvent函数,如下: package cc.newnews.view; import an

  • Android编程记录ListView标记行状态的方法

    本文实例讲述了Android编程记录ListView标记行状态的方法.分享给大家供大家参考,具体如下: 小Demo无什么特别之处,最特别的就是尽量少用notifyDataSetChanged,开销太大了,当然使用是会省不少工的,不过有时候还是会遇到别的问题的,项目经验表示会有这个可能性的,废话不多少了,直接上关键代码. @Override public void onItemClick(AdapterView<?> adapterView, View view, int pos, long a

  • Android编程实现Listview点击展开和隐藏的方法

    本文实例讲述了Android编程实现Listview点击展开和隐藏的方法.分享给大家供大家参考,具体如下: 代码较多,所以找关键点大家贴出来,相信大家看了之后很容易就明白的, 在listview的activity中 List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>() myAdapter = new MyAdapter(getApplicationContext(

  • Android编程实现ListView内容无限循环显示的方法

    本文实例讲述了Android编程实现ListView内容无限循环显示的方法.分享给大家供大家参考,具体如下: 其实要达到无限循环显示,主要就是实现继承Adapter的类. 我这里用到的是BaseAdapter private class MyAdapter extends BaseAdapter{ private Context context; private String[] strs = null; LayoutInflater inflater = null; public MyAdap

  • Android编程使用ListView实现数据列表显示的方法

    本文实例讲述了Android编程使用ListView实现数据列表显示的方法.分享给大家供大家参考,具体如下: 要将数据库中的数据列表显示在屏幕上,我们要使用ListView这个控件,当用户从数据库中取出数据时,要将数据绑定到显示控件上,如何绑定呢,我们需要创建适配器进行绑定,创建适配器有两种方式: 第一种是用SimpleAdapter创建(要求绑定的数据是List<HashMap<String, Object>>数据类型) 第二种是用SimpleCursorAdapter创建(要求

  • Android编程实现ListView滚动提示等待框功能示例

    本文实例讲述了Android编程实现ListView滚动提示等待框功能.分享给大家供大家参考,具体如下: 其实原理很简单,只需要设置监听listview的滚动事件即可 file1: package cn.stay.activity; import java.util.ArrayList; import java.util.List; import com.aoran.R; import android.app.Activity; import android.os.Bundle; import

随机推荐