当前位置: 移动技术网 > 移动技术>移动开发>Android > android 通过向viewpage中添加listview来完成滑动效果(类似于qq滑动界面)

android 通过向viewpage中添加listview来完成滑动效果(类似于qq滑动界面)

2019年07月24日  | 移动技术网移动技术  | 我要评论

文件名:page.xml

复制代码 代码如下:

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <listview
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</relativelayout>

文件名:listviewitem.xml

复制代码 代码如下:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

     <textview
        android:id="@+id/textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="hello"
        android:textcolor="#00ff00"
      />
    <imageview
        android:id="@+id/imageview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        />
</linearlayout>


以上的第二个布局文件 只提供给simpleadapter

复制代码 代码如下:

package com.example.learnpager2;

import java.util.arraylist;
import java.util.hashmap;
import java.util.list;
import java.util.map;

import android.app.activity;
import android.graphics.color;
import android.os.bundle;
import android.os.parcelable;
import android.support.v4.view.pageradapter;
import android.support.v4.view.viewpager;
import android.support.v4.view.viewpager.onpagechangelistener;
import android.util.log;
import android.view.layoutinflater;
import android.view.menu;
import android.view.view;
import android.view.viewgroup;
import android.view.viewparent;
import android.widget.arrayadapter;
import android.widget.button;
import android.widget.listview;
import android.widget.relativelayout;
import android.widget.simpleadapter;

public class pageractivity extends activity {
    viewpager viewpager;
    arraylist<view> pagesarraylist;// 添加listview 然后传给mypageradapter 充当媒介
    string[] strs;
    string[] strs2;
    listview listview;
    button button1;
    button button2;
    button button3;
    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.activity_pager);
        iniparams();
        iniviews();

    }
    private void iniparams(){
        pagesarraylist=new arraylist<view>();
        strs=new string[]{"a","b","c","a","b","c","a","b","c"};
        strs2=new string[]{"1","2","3","1","2","3","1","2","3"};

    }
    private void iniviews(){
        viewpager=(viewpager)findviewbyid(r.id.viewpager);
        //第一个页面的viewpager第1个page里的listview
        layoutinflater layoutinflater=getlayoutinflater();

        listview=(listview)
                (layoutinflater.inflate(r.layout.page,null).findviewbyid(r.id.listview));
        arrayadapter<string> arrrayadapter=new arrayadapter<string>(this,android.r.layout.simple_list_item_1,strs);
        listview.setadapter(arrrayadapter);
        pagesarraylist.add(listview);


        //第个页面的viewpager第2个page里的listview
        listview=(listview)
                (layoutinflater.inflate(r.layout.page,null).findviewbyid(r.id.listview));
        arrayadapter<string> arrrayadapter2=new arrayadapter<string>(this,android.r.layout.simple_list_item_1,strs2);
        listview.setadapter(arrrayadapter2);
        pagesarraylist.add(listview);

        //第三个面的viewpager第3个page里的listview
        simpleadapter simpleadapter3=new simpleadapter(this,getdatasforlistview(),
                r.layout.listviewitem,new string[]{"title","image"},new int[]{r.id.textview,r.id.imageview});
        listview=(listview)
                (layoutinflater.inflate(r.layout.page, null).findviewbyid(r.id.listview));
        listview.setadapter(simpleadapter3);
        pagesarraylist.add(listview);


        viewpager.setadapter(new mypageradapter(pagesarraylist));
        viewpager.setonpagechangelistener(new myonpagechangelistener());
        viewpager.setcurrentitem(0);

        button1=(button)findviewbyid(r.id.button1);
        button2=(button)findviewbyid(r.id.button2);
        button3=(button)findviewbyid(r.id.button3);
    }
    public list<map<string, object>> getdatasforlistview(){
        log.e("3", "");
        list<map<string, object>> listmaps=new arraylist<map<string,object>>();

        string[] strings=new string[]{"图片1","图片2","图片3"};
        int[] images=new int[]{r.drawable.p1,r.drawable.p1,r.drawable.p1};

        for(int i=0;i<strings.length;i++){
            listmaps.add(listviewitemfactory.generate(new object[]{strings[i],images[0]}));
        }
        return listmaps;
    }
    static class listviewitemfactory{
        static map<string,object> generate(object[] obj){
            map<string,object> map=new hashmap<string, object>();
            map.put("title", obj[0]);
            map.put("image",obj[1]);
            return map;
        }
    }

    @override
    public boolean oncreateoptionsmenu(menu menu) {
        // inflate the menu; this adds items to the action bar if it is present.
        getmenuinflater().inflate(r.menu.pager, menu);
        return true;
    }
    public class mypageradapter extends pageradapter {
        public list<view> mlistviews;

        public mypageradapter(list<view> mlistviews) {
            this.mlistviews = mlistviews;
        }

        @override
        public void destroyitem(view arg0, int arg1, object arg2) {

            log.d("destroyitem", ""+arg0+" "+arg1);
            ((viewpager) arg0).removeview(mlistviews.get(arg1));
        }
        @override
        public int getcount() {
            return mlistviews.size();
        }

        @override
        public object instantiateitem(view arg0, int arg1) {
            log.d("instantiateitem", ""+arg0+" "+arg1);
            try {
                if(mlistviews.get(arg1).getparent()==null)
                    ((viewpager) arg0).addview(mlistviews.get(arg1), 0); 
                else{
                    //  很难理解新添加进来的view会自动绑定一个父类,由于一个儿子view不能与两个父类相关,所以得解绑
                    //不这样做否则会产生 viewpager java.lang.illegalstateexception: the specified child already has a parent. you must call removeview() on the child's parent first.
// 还有一种方法是viewpager.setoffscreenpagelimit(3); 这种方法不用判断parent 是不是已经存在,但多余的listview不能被destroy
                    ((viewgroup)mlistviews.get(arg1).getparent()).removeview(mlistviews.get(arg1));

                    ((viewpager) arg0).addview(mlistviews.get(arg1), 0);
                }
            } catch (exception e) { 
                // todo auto-generated catch block 
                log.d("parent=", ""+mlistviews.get(arg1).getparent());
                e.printstacktrace(); 
            } 
            return mlistviews.get(arg1);
        }

        @override
        public boolean isviewfromobject(view arg0, object arg1) {
            return arg0 == (arg1);
        }

        @override
        public void restorestate(parcelable arg0, classloader arg1) {
        }

        @override
        public parcelable savestate() {
            return null;
        }

        @override
        public void startupdate(view arg0) {
        }
    }
    class myonpagechangelistener implements onpagechangelistener{

        @override
        public   void onpagescrollstatechanged (int state){
            // todo auto-generated method stub

        }

        @override
        public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) {
            // todo auto-generated method stub

        }
        color precolor;
        @override
        public void onpageselected(int position) {
            // todo auto-generated method stub
            log.d("page",  "pos="+position);
            switch(position)
            {
            case 0: //button1.setbackgroundcolor(0x00ff00);break;
            case 1:// button1.setbackgroundcolor(0xff0000);break;
            case 2:
            }

        }

    }
}

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网