Android学习 (二十三) 自定义ViewPager的适配器
来源:互联网 发布:切换输入法快捷键mac 编辑:程序博客网 时间:2024/04/29 21:13
很多时候ViewPager都是和fragment联合起来使用的,但是有时候也需要定义自己的适配器完成一些其他的需求。
下面就来记录一下自己自定义ViewPager适配器的过程。
其实自定义ViewPager适配器和ListView过程基本都差不多,如图,标号基本就是一个实现的顺序。
1.在activity_main.xml文件中加入ViewPager控件:
<android.support.v4.view.ViewPager android:id="@+id/view_pager_second_activity" android:layout_width="match_parent" android:layout_height="wrap_content">
2.新建一个Person.java类。用来定义一些自定义的变量。
ublic class Person{ private int age = 0; private String gender = "男"; public void setAge(int age){ this.age = age; } public int getAge(){ return age; } public void setGender(String gender){ this.gender = gender; } public String getGender(){ return gender; }}
3.创建一个main_activity_item.xml,作为子项布局。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text_age" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/text_gender" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp"/></LinearLayout>
我只写了两个控件,因为我Person类里面也只定义了两个变量。
4.接下来是很重要的一步,也是我思考时间比较久的一步。自定义适配器。其实这一步还是比较简单,重载四个函数而已。而且基本上适配器里面,如果没有其他需求的话,都是重载这四个函数。
这里我传了两个参数进来:
Activity activity:用来表示在当前的Activity中执行
List viewList:把View的实例化对象存放在了viewList里面
public class PersonSecondAdapter extends PagerAdapter{ private List<View>viewList; private Activity activity; //构造函数 public PersonSecondAdapter(Activity activity, List<View> viewList){ this.activity = activity; this.viewList = viewList; } @Override public boolean isViewFromObject(View arg0,Object object){//view是否来自对象 return arg0 == object; } @Override public void destroyItem(ViewGroup container, int itemPosition,Object object){//销毁当前页卡 Log.d("=====destroyItem",String.valueOf(itemPosition)); container.removeView(viewList.get(itemPosition));//viewList是存放view的数据结构 } @Override//获取当前页卡数量 public int getCount(){ if(viewList != null){ return viewList.size(); } return 0; } @Override//初始化Position位置的界面 public Object instantiateItem(ViewGroup container,int itemPosition){//实例化当前页卡 Log.d("=====instantiateItem",String.valueOf(itemPosition)); container.addView(viewList.get(itemPosition));//把我刚刚新建的view传进去 return viewList.get(itemPosition); }}
5.这个是实现适配器和ViewPager的链接使用。主要的需要想明白的地方是:
我还是先把MainActivity.java里面的全部代码贴上再详细解答:
public class SecondActivity extends AppCompatActivity { private List<View> viewList= new ArrayList<View>();//用来装适配器的资源 private ViewPager viewPager;//实例 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initPerson();//初始化viewList PersonSecondAdapter myAdapter = new PersonSecondAdapter(SecondActivity.this,viewList); ViewPager myViewPager = (ViewPager)findViewById(R.id.view_pager_second_activity); myViewPager.setAdapter(myAdapter); } public void initPerson(){//给viewList添加数据 Person person1 = new Person(); View view1 = null; person1.setAge(100); person1.setGender("男"); viewList.add(setViewListData(view1,person1)); Person person2 = new Person(); View view2 = null; person2.setAge(19); person2.setGender("girl"); viewList.add(setViewListData(view2,person2)); Person person3 = new Person(); View view3 = null; person3.setAge(1865); person3.setGender("hhh"); viewList.add(setViewListData(view3,person3)); Person person4 = new Person(); View view4 = null; person4.setAge(88); person4.setGender("xixixi"); viewList.add(setViewListData(view4,person4)); } //实现把person里面的数据添加到viewList里面 public View setViewListData(View view,Person person){ view = LayoutInflater.from(SecondActivity.this).inflate(R.layout.second_activity_item,null);//把子项布局加载到view里面 TextView text1 = (TextView) view.findViewById(R.id.text_age); TextView text2 = (TextView) view.findViewById(R.id.text_gender); text1.setText(String.valueOf(person.getAge())); text2.setText(person.getGender()); return view; }}
这里,实现这两个的对应是通过这段代码来的:
Person person1 = new Person();//然后初始化数据person1.setAge(100); person1.setGender("男");View view1 = LayoutInflater.from(SecondActivity.this).inflate(R.layout.second_activity_item,null);//把子项布局加载到view里面,注意这里有个参数null。然后找到空间布局的id TextView text1 = (TextView) view.findViewById(R.id.text_age); TextView text2 = (TextView) view.findViewById(R.id.text_gender);//把数据添加到控件里面 text1.setText(String.valueOf(person.getAge()));//注意这里的类型转换 text2.setText(person.getGender());-------------------------------------------------------------//以上的代码已经完成了View和Person的对应。--------------------------------------------------------------//把View的实例化对象view1添加到viewList里面 viewList.add(view1);
但是你会发现,每次你实例化一个Person和View对象的时候,总是会有一些代码需要重复写,所以我又写了一个函数,来避免代码的重复:
//实现把person里面的数据添加到viewList里面 public View setViewListData(View view,Person person){ view = LayoutInflater.from(SecondActivity.this).inflate(R.layout.second_activity_item,null);//把子项布局加载到view里面 TextView text1 = (TextView) view.findViewById(R.id.text_age); TextView text2 = (TextView) view.findViewById(R.id.text_gender); text1.setText(String.valueOf(person.getAge())); text2.setText(person.getGender()); return view; }
以上,为所有内容,点击运行,效果如下:
一次滑动分别为,页面1、2、3、4:
0 0
- Android学习 (二十三) 自定义ViewPager的适配器
- Android学习之路--简单的ViewPager(二 自定义ViewPager)
- Android学习(十八)ViewPager适配器编写
- android ViewPager学习(二)创建自定义标题
- Android学习 17 ->自定义适配器的学习
- 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
- 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
- (转)【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
- 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
- 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
- 通用适配器(二)── 适用于 ViewPager 的 CommonFragmentAdapter
- android学习二:适配器Adapter的使用
- Android学习 (二十二) ViewPager滑动的页面状态
- android学习之自定义适配器
- Android开发-自定义View-AndroidStudio(十三)仿ViewPager(3)
- Android之自定义实现BaseAdapter(通用适配器二)
- 【Android个人理解(二)】从实现方法深入了解自定义适配器的工作过程
- Android:ViewPager适配器PagerAdapter的使用
- jquery同时修改a标签的href链接和文字
- 给了夜
- Java 代理模式-JDK动态代理-实现对请求中文乱码的处理
- csdn积分获取标准
- java自定义注解的基本教程
- Android学习 (二十三) 自定义ViewPager的适配器
- 解决 前端传入controller时的String变量乱码问题
- caffe源码学习-io
- Nginx:正向代理与反向代理的区别
- 深层学习为何要“Deep”(下)
- ubuntu14.04安装opencv
- display:inline、display:block、display:inline-block三者真实用途及含义是什么?
- “fatal: 'git status --porcelain' failed in submodule
- 算法-查找算法