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实现特 ...
随机推荐
- Python3 k-邻近算法(KNN)
# -*- coding: utf-8 -*- """ Created on Fri Dec 29 13:13:44 2017 @author: markli " ...
- Future和FutureTask
上次介绍了Callable实现多线程的方法.现在介绍和Callable搭配的类.上一篇只是简单的用Callable做了一个demo. 一.Future 1.关于callable和runable的区别( ...
- 喵哈哈村的魔法考试 Round #7 (Div.2) 题解
喵哈哈村的魔法考试 Round #7 (Div.2) 注意!后四道题来自于周日的hihocoder offer收割赛第九场. 我建了个群:欢迎加入qscoj交流群,群号码:540667432 大概作为 ...
- VMware安装MikroTik RouterOS chr
简单步骤: 1.官网下载ova镜像 2.导入到vmware即可.
- Serilog简介
Serilog是.net 下的新兴的日志框架,本文这里简单的介绍一下它的用法. 首先安装Nuget包: Install-Package Serilog Install-Package Serilog. ...
- POJ 1741 Tree (树分治入门)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8554 Accepted: 2545 Description ...
- AE开发中关于 “无法嵌入互操作类型.........请改用适用的接口”问题的解决方法
最近开始使用VS2010,在引用COM组件的时候,出现了“无法嵌入互操作类型……,请改用适用的接口”的错误提示. 查阅资料,找到解决方案,记录如下: 选中项目中引入的dll,鼠标右键,选择属性,把“嵌 ...
- Revit API封装一个通用函数“过名称找元素”
感觉这个函数不错.通过这种方式寻找元素经常需要用到. ) { ]; } // cannot find it. return null; ...
- linux 学习之路(学linux必看)
很多同学接触Linux不多,对Linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员, 掌握Linux是一种很重要的谋生资源与手段. 下来我将 ...
- 使用C#的泛型队列Queue实现生产消费模式
本篇体验使用C#的泛型队列Queue<T>实现生产消费模式. 如果把生产消费想像成自动流水生产线的话,生产就是流水线的物料,消费就是某种设备对物料进行加工的行为,流水线就是队列. 现在,要 ...