所谓动态添加,就是viewpager中有多个view,然后每个view中又有很多item,每个view相应的会有一个小圆点指示器;view、小圆点是根据实际数据的个数以及每页的item数动态生成的。此外我还做了item的点击事件,还做了一个demo供大家交流学习,demo下载地址:http://download.csdn.net/detail/sinat_27681957/9501946(转载请说明来处,谢谢)
我先讲一下大体思路,首先主布局文件中要有一个viewpager,这个是无可争议的,那么对应的就要有一个adapter适配器对不对;然后还要有一个view的布局,因为viewpager会不停的切换页面,这时view的布局就可以重复使用了;每个view的布局中我事先放置了4个imgeview和textview,主要是为了方便显示数据;最后后台写一个函数,这个函数的作用是根据实际数据量动态的判断会产生多少个view,比如说我这里有6个房间,那么函数判断得出应该有两个view,应该有两个小圆点指示器,那么就动态的添加2个小圆点指示器。
好了,思路差不多就是这些,下面我会放一些代码,具体内容大家可以看一下,也可以直接看demo
主布局文件:activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".RoomFragment"> <!-- FrameLayout Bottom--> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="105dp" android:layout_marginTop="5dp" android:layout_alignParentBottom="true" android:background="#4400FF88"> <!-- ViewPager --> <android.support.v4.view.ViewPager android:id="@+id/viewpager_room" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v4.view.ViewPager> <!-- 圆点指示器 --> <LinearLayout android:id="@+id/ll_dots" android:layout_width="match_parent" android:layout_height="20dp" android:layout_gravity="bottom" android:layout_marginBottom="5dp" android:gravity="center" android:orientation="horizontal"> </LinearLayout> </FrameLayout> </RelativeLayout>view布局文件viewpager_four_item.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rl_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_alignParentBottom="true"> <!--1--> <LinearLayout android:id="@+id/ll_bottom_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:layout_weight="1" android:orientation="vertical"> <ImageView android:id="@+id/img_1" android:layout_width="60dp" android:layout_height="60dp" /> <TextView android:id="@+id/tv_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" /> </LinearLayout> <!--2--> <LinearLayout android:id="@+id/ll_bottom_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" android:gravity="center" android:layout_toRightOf="@+id/ll_bottom_1"> <ImageView android:id="@+id/img_2" android:layout_width="60dp" android:layout_height="60dp" android:gravity="center" /> <TextView android:id="@+id/tv_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"/> </LinearLayout> <!--3--> <LinearLayout android:id="@+id/ll_bottom_3" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center" android:layout_weight="1" android:layout_toRightOf="@+id/ll_bottom_2"> <ImageView android:id="@+id/img_3" android:layout_width="60dp" android:layout_height="60dp"/> <TextView android:id="@+id/tv_3" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" /> </LinearLayout> <!--4--> <LinearLayout android:id="@+id/ll_bottom_4" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center" android:layout_weight="1" android:layout_toRightOf="@+id/ll_bottom_3"> <ImageView android:id="@+id/img_4" android:layout_width="60dp" android:layout_height="60dp"/> <TextView android:id="@+id/tv_4" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" /> </LinearLayout> </LinearLayout>主类MainActivity.java:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ //private List<Room> listRoom=new ArrayList<Room>(); private ArrayList<View> views = null; private ViewPager viewPager; private int count = 1; private ViewPagerAdapter adapter; private static int pageNum=1; private static int positionNow=0; private LinearLayout relativeLayout; //动态添加的内容 private int[] imgid={R.drawable.keting2, R.drawable.keting2, R.drawable.keting2, R.drawable.keting2, R.drawable.keting2, R.drawable.keting2}; private String[] textid={"客厅","卧室","厨房","书房","浴室","洗手间"}; //布局文件中的控件 private final int[] layout_img_id={R.id.img_1,R.id.img_2,R.id.img_3,R.id.img_4}; private final int[] layout_tv_id={R.id.tv_1,R.id.tv_2,R.id.tv_3,R.id.tv_4}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { viewPager = (ViewPager)findViewById(R.id.viewpager_room);// 找到ViewPager viewPager.setOnPageChangeListener(pageChangeListener);// 设置页面滑动监听 Entity entity=new Entity(); pageNum=entity.getPageNum(imgid.length,4);//view 的页数 //根据页数动态生成指示器 relativeLayout=(LinearLayout)findViewById(R.id.ll_dots); for(int i=0;i<pageNum;i++){ if(pageNum>1){ ImageView img= new ImageView(this); if(i==0) { img.setImageResource(R.drawable.dot_selected); } else { img.setImageResource(R.drawable.dot_normal); } img.setId(i); //注意这点 设置id relativeLayout.addView(img); } } //动态生成viewpager的多个view for(int i=0;i<pageNum;i++){ initListViews(count++); } instantiated(imgid.length,4);//实例化ViewPager adapter = new ViewPagerAdapter(views);// 构造adapter viewPager.setAdapter(adapter);// 设置适配器 } //实例化pagerview中ImageView、TextView 方法,输入数组长度、每页item数 private void instantiated(int listSize,int numberOfEveryPage){ for(int i=0; i<pageNum-1; i++){ for(int j=0;j<numberOfEveryPage;j++){ TextView textview=(TextView)views.get(i).findViewById(layout_tv_id[j]); ImageView imageview=(ImageView)views.get(i).findViewById(layout_img_id[j]); textview.setText(""+textid[i*numberOfEveryPage+j]); imageview.setImageResource(imgid[i*numberOfEveryPage+j]); imageview.setOnClickListener(this); } } if(listSize%numberOfEveryPage!=0){ for(int k=0;k<listSize%numberOfEveryPage;k++){ ImageView imageview=(ImageView)views.get(pageNum-1).findViewById(layout_img_id[k]); TextView textview=(TextView)views.get(pageNum-1).findViewById(layout_tv_id[k]); imageview.setImageResource(imgid[(pageNum - 1) * 4 + k]); imageview.setOnClickListener(this); textview.setText(textid[(pageNum-1)*numberOfEveryPage+k]); } } } /** * listViews添加view对象 * */ private void initListViews(int count) { if (views == null) { views = new ArrayList<View>(); } LayoutInflater inflater=LayoutInflater.from(this); views.add(inflater.inflate(R.layout.viewpager_four_item, null)); } /** * 页面监听事件 */ private ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() { private int oldPosition = 0; public void onPageSelected(int position) {// 页面选择响应函数 positionNow=position; if(pageNum>1){ ImageView img=(ImageView)findViewById(getResources().getIdentifier("" + position, "id", "com.lei.addviewpageritem")); img.setImageResource(R.drawable.dot_selected); ImageView imgold=(ImageView)findViewById(getResources().getIdentifier("" + oldPosition, "id", "com.lei.addviewpageritem")); imgold.setImageResource(R.drawable.dot_normal); oldPosition=position; } } public void onPageScrolled(int arg0, float arg1, int arg2) {// 滑动中。。。 } public void onPageScrollStateChanged(int arg0) {// 滑动状态改变 } }; //监听pagerview的点击事件 public void onClick(View v) { switch (v.getId()){ case R.id.img_1: int a1=positionNow*4+0; if (a1<imgid.length){ Toast.makeText(MainActivity.this, "第" + (positionNow + 1) + "页,第" + 1 + "项", Toast.LENGTH_SHORT).show(); } break; case R.id.img_2: int a2=positionNow*4+1; if (a2<imgid.length){ Toast.makeText(MainActivity.this,"第"+(positionNow+1)+"页,第"+2+"项",Toast.LENGTH_SHORT).show(); } break; case R.id.img_3: int a3=positionNow*4+2; if (a3<imgid.length){ Toast.makeText(MainActivity.this,"第"+(positionNow+1)+"页,第"+3+"项",Toast.LENGTH_SHORT).show(); } break; case R.id.img_4: int a4=positionNow*4+3; if (a4<imgid.length){ Toast.makeText(MainActivity.this,"第"+(positionNow+1)+"页,第"+4+"项",Toast.LENGTH_SHORT).show(); } break; default: break; } }
判断页数的方法:Entity.java:
public class Entity { //根据数组的长度、每页item数量,确定viewpager的页数 public int getPageNum(int length,int numberOfEveryPage){//数组长度、每页item数量 int n=1; if(length>numberOfEveryPage){ while(length-numberOfEveryPage>=0){ n++; length=length-numberOfEveryPage; } return n; } return n; }
好了差不多就是这些了。。。。。