作为一个android的小菜鸟,第一次写微博总是有点小忐忑的,今天看项目的源代码时,对ViewPager控件比较感兴趣,便查了点资料自己写了一个十分简单的demo。
ViewPager作为一个ViewGroup的扩展,他的实现有点类似于ListView控件,我自己喜欢把这类的控件叫做AdapterView,就是需要适配器的View。
接下来,我们就来看一下这类控件实现的基本步骤,当然这里我还没有能力从源码的角度去解释整个控件的运行。
AdapterView(需要适配器的View)一般都具有三个要素:1)控件本身,本文就是ViewPager 2)与之匹配的适配器adapter 3)控件所需要展示的数据(包含数据和布局,统称为数据)
adapter就像一个连接ViewPager和数据的桥梁,他的实现是ViewPager功能有效执行的关键。所以,在定义自己需要的adapter的时候需要注意两个方面:1)如何与ViewPager联系起来(一般这种面向控件的操作十分简单,直接调用ViewPager的setAdapter()方法) 2)如何与数据层联系起来:这里就需要根据自己的需求去定义UI布局和数据,然后将定义好的数据传给adapter
数据的形式应该是怎么样的?对于AdapterView来说,每一项的布局应该是完全一样的,但是其中展现的数据可能不一样,但数据类型在整体上来说肯定是一样的。所以在这里用ArrayList< View >十分恰当,可以在adapter的实现中,定义一个ArrayList< View >类型的成员,用来保存所要展示的数据(UI布局和数据)。显然在这里,View = 数据+布局。
- MainActivity代码:
package com.example.administrator.mylinkedviewpager;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import com.example.administrator.myadapter.ViewPagerAdapter;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewPager vp;
private List<View> views = new ArrayList<View>();
private ViewPagerAdapter vpAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
public void initViews(){
LayoutInflater inflater = LayoutInflater.from(this);
View view1 = inflater.inflate(R.layout.guide, null);
initView(view1,R.drawable.guide_1);
views.add(view1);
View view2 = inflater.inflate(R.layout.guide, null);
initView(view2,R.drawable.guide_2);
views.add(view2);
View view3 = inflater.inflate(R.layout.guide, null);
initView(view3,R.drawable.guide_3);
views.add(view3);
vp = (ViewPager)findViewById(R.id.viewPager);
vpAdapter = new ViewPagerAdapter(views,this);
vp.setAdapter(vpAdapter);
}
public void initView(View view,int drawable){
ImageView imgView = (ImageView)view.findViewById(R.id.imgView);
imgView.setImageResource(drawable);
}
}
2.适配器代码:
package com.example.administrator.myadapter;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import java.util.List;
/**
* Created by zhouyoudade on 2016/7/19 0019.
*/
public class ViewPagerAdapter extends PagerAdapter {
private List<View> views;
private Context context;
public ViewPagerAdapter(List<View> views, Context context) {
this.views = views;
this.context = context;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager)container).removeView(views.get(position));
}
@Override
public Object instantiateItem(View container, int position) {
((ViewPager)container).addView(views.get(position));
return views.get(position);
}
@Override
public int getCount() {
return views.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return (view == object);
}
}
3.布局文件:
---------------------guide.xml---------------------------
<?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">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imgView"/>
</RelativeLayout>
--------------activity_main.xml--------------------------
<?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">
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewPager">
</android.support.v4.view.ViewPager>
</RelativeLayout>