android 很多应用中用到的 listView + viewPager
比如网易啊啥的, 有些界面的 listview 第一行是可以 左右滑动的 viewpager,当滑动下面listView的时候 会一起滑动上去
工程目录:
效果图:
1. MyViewPager.java
public class MyViewPager extends ViewPager {
int mLastMotionY;
int mLastMotionX;
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
//拦截 TouchEvent
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
return super.onInterceptTouchEvent(arg0);
}
//处理 TouchEvent
@Override
public boolean onTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
return super.onTouchEvent(arg0);
}
//因为这个执行的顺序是 父布局先得到 action_down的事件
/**
* onInterceptTouchEvent(MotionEvent ev)方法,这个方法只有ViewGroup类有
* 如LinearLayout,RelativeLayout等 可以包含子View的容器的
*
* 用来分发 TouchEvent
* 此方法 返回true 就交给本 View的 onTouchEvent处理
* 此方法 返回false 就交给本View的 onInterceptTouchEvent 处理
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//让父类不拦截触摸事件就可以了。
this.getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
}
2. MainActivity.java
public class MainActivity extends Activity {
private ListView listView;
private MyAdapter MyAdapter;
private List<View> list_views =new ArrayList<View>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.newslist_main);
//造1个 假数据
for (int i = 0; i <4; i++) {
View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.topimage, null);
if(i == 0){
v.setBackgroundResource(R.drawable.a1);
}else if( i ==1){
v.setBackgroundResource(R.drawable.a2);
}else if(i ==2){
v.setBackgroundResource(R.drawable.a3);
}else if( i ==3){
v.setBackgroundResource(R.drawable.a4);
}
list_views.add(v);
}
listView = (ListView) findViewById(R.id.newslist);
MyAdapter = new MyAdapter(this,list_views);
listView.setAdapter(MyAdapter);
}
}
3.MyAdapter
public class MyAdapter extends BaseAdapter {
private View topViewPager; //顶部View
private ViewPager viewPager; //顶部View 中的ViewPager
private MyPagerAdapter pageAdaper; //Viewpager adapter
private List<View> images; //上方viewpager的图片
private Context context;
public MyAdapter(Context context,List<View> images) {
this.context = context;
this.images = images;
pageAdaper = new MyPagerAdapter();
}
//ListView size
@Override
public int getCount() {
return 20;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(position == 0){
//第一行 viewpager的layout
return setTopView(convertView);
}else {
//其他listView
View view = LayoutInflater.from(context).inflate(R.layout.listitem, null);
return view;
}
}
private View setTopView(View convertView){
if(topViewPager==null){
//加载顶部View
topViewPager = LayoutInflater.from(context).inflate(R.layout.index_photos, null);
//设置Viewpager
viewPager = (ViewPager)topViewPager.findViewById(R.id.topViewPager);
//塞入adapter
viewPager.setAdapter(pageAdaper);
//默认选中第一个
viewPager.setCurrentItem(0);
viewPager.setOnPageChangeListener(new MyPagerChangeListener());
}
return topViewPager;
}
private class MyPagerChangeListener implements OnPageChangeListener{
@Override
public void onPageSelected(int position) {
Toast.makeText(context, "position="+ position, 1).show();
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
}
/**
* ViewPager adapter
*/
public class MyPagerAdapter extends PagerAdapter {
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
// @Override
// public int getItemPosition(Object object) {
// // return super.getItemPosition(object);
// return POSITION_NONE;
// }
@Override
public int getCount() {
return images.size();
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView(images.get(position));
}
// viewpager 每个页卡的实例化
@Override
public Object instantiateItem(View container, int position) {
((ViewPager) container).addView(images.get(position));
return images.get(position);
}
}
}
adapter 把 pageradapter 和 listadapter的组合
xml其实没有什么贴的了。, 就是1个 listview ,1个 viewpager 就完了(当然这个是自己继承后的 那个View),
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
> <com.example.custome.MyViewPager
android:id="@+id/topViewPager"
android:layout_width="match_parent"
android:layout_height="300dip"
android:background="#ffffff"
android:layout_gravity="top"
/> </LinearLayout>
另外1个就是一个 listview了。
好了。
android 很多应用中用到的 listView + viewPager的更多相关文章
- Android listview viewpager解决冲突 滑动
Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 在listview 上使用 addHeaderView 在第 ...
- android 很多牛叉布局github地址(转)
原文地址 http://blog.csdn.net/luo15309823081/article/details/41449929 点击可到达github-------https://github.c ...
- Android开发之漫漫长途 XIV——ListView
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android开发之漫漫长途 XVI——ListView与RecyclerView项目实战
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- android 项目学习随笔九(ListView加头布局)
1.缓冲背景色 <ListView android:id="@+id/lv_list" android:layout_width="match_parent&quo ...
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...
- android 简易时间轴(实质是ListView)
ListView的应用 1.在很多时候是要用到时间轴的,有些处理的时间轴比较复杂,这里就给出一个比较简单的时间轴,其实就是ListView里面的Item的设计. 直接上代码: ListView,ite ...
- 安卓Android基础第三天——数据库,ListView
数据库介绍sqlite问:什么情况下使用数据库?答:有大量相似结构的数据需要存储的时候 数据库的创建定义一个类继承SqliteOpenHelpercontext:上下文name:数据库名字,如&quo ...
- Android实现页面跳转、ListView及其事件
Android实现页面跳转.ListView及其事件 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 进入主页面后,使用ListView实现特 ...
随机推荐
- C# Socket异步实现消息发送--附带源码
前言 看了一百遍,不如动手写一遍. Socket这块使用不是特别熟悉,之前实现是公司有对应源码改改能用. 但是不理解实现的过程和步骤,然后最近有时间自己写个demo实现看看,熟悉熟悉Socket. 网 ...
- SQL2008配置管理工具服务显示远程过程调用失败
问题: 打开SQL2008配置管理工具,发现SQL服务名称里什么也没有,只有一个提示: 解决办法: 这是由于电脑中安装有Visual Stuido, 它内含一个本地SQL数据库服务:Microso ...
- OpenVPN的ipp.txt为空不生效的问题
1.ipp.txt是分配固定IP使用的,但在tun模式下里面的ip地址不是写使用着的IP,而是30位子网中没有列举出来的启动一位,比如我要给客户机分配为10.8.0.6的IP,那么它这个文件填写的是1 ...
- javascript区域打印代码
这段代码是我从Highcharts的代码中改造出来的,非常感谢Highcharts的作者,先链上Highcharts的地址http://www.highcharts.com/,(Highcharts的 ...
- HDU 4737 A Bit Fun (2013成都网络赛)
A Bit Fun Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- stm32f103串口实现映射功能
在实际开发中,常常遇到串口的默认输出IO口被其它模块占用了,所以我们要用到串口IO口映射功能.是指将原来实现功能的IO口映射到其它指定IO口,其它不变.详细操作例如以下: 先贴出默认下的串口初始化设置 ...
- BoundingBoxUV与BoundingBoxXYZ
start UIApplication app = commandData.Application; Document doc = app.ActiveUIDocument.Document; ); ...
- 基于SmartThreadPool线程池技术实现多任务批量处理
一.多线程技术应用场景介绍 本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何采用基于开源组件SmartThreadPool线程池技术实现多任务批量处理.在工作中您是否 ...
- delphi DockPresident
作为Delphi的忠实用户,我想大家对Delphi中的停靠窗体应该比较熟悉吧,是不是也希望自己编的程序也具有这样的功能?使她看起来更漂亮,更专业,更方便. 本人做的一套停靠控件DockPresiden ...
- centos下从源码安装openssl 1.0.1g
cd /usr/srcwget https://www.openssl.org/source/openssl-1.0.1g.tar.gz -O openssl-1.0.1g.tar.gz tar -z ...