Android学习 (二十四) 实现ListView跳转到对应页面的ViewPager

来源:互联网 发布:中国大数据规划图 编辑:程序博客网 时间:2024/06/06 02:52

这几天因为项目需求,要实现,点击listView列表跳转到相对应的ViewPager界面。
如图:

这里写图片描述

我整个测试项目的逻辑结构是这样的:

这里写图片描述

项目实现后是这样的:

这里写图片描述

那就分为两个部分来讲。第一部分为ListView,第二部分为ViewPager。

一、
1)新建一个项目,在activity_main.xml布局文件中加入ListView控件:

  <ListView      android:id="@+id/listview_main_activity"      android:layout_width="wrap_content"      android:layout_height="wrap_content">  </ListView>

2)写listView的子项布局文件main_activity_item.xml,我只添加了一个控件。

   <TextView        android:id="@+id/text_name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="gucheng"        android:textSize="40dp"/>

然后新建一个Person类,用来定义数据变量。MainActivity中只用到了private String name;
其他的我留来给ViewPager用。

public class Person{    private String name = "gucheng";    private int age = 0;    private String gender = "男";    public void setName(String name){        this.name = name;    }    public String getName(){        return name;    }    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)写ListView的适配器:PersionMainAdapter.java,很简单,我前面的博客也有介绍。

这里ListView的适配器是继承自ArrayAdapter和ViewPager不一样。

public class PersonMainAdapter extends ArrayAdapter<Person>{    private int resourceId;//子项布局的id    //构造函数    public PersonMainAdapter(Context context, int layoutItemId, List<Person> objects){        super(context,layoutItemId,objects);        resourceId = layoutItemId;    }    @Override    public View getView(int position,View contentView,ViewGroup parent){        Person person = getItem(position);        View view = LayoutInflater.from(getContext()).inflate(resourceId,null);        TextView textView = (TextView)view.findViewById(R.id.text_name);        textView.setText(person.getName());        return view;    }}

4)最后在MainActivity.java实现代码,先来看总代码,下面详细说一下。

public class MainActivity extends AppCompatActivity {    private List<Person> personList = new ArrayList<Person>();//存储Person的实例化对象    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initPersonName();//初始化姓名        PersonMainAdapter personMainAdapter = new PersonMainAdapter(MainActivity.this,R.layout.main_activity_item,personList);        ListView listView = (ListView)findViewById(R.id.listview_main_activity);        listView.setAdapter(personMainAdapter);        //设置listView的点击事件        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {               // Log.d("---=====---------96", String.valueOf(position));               //这里position就表示的Person实例化对象在personList里面的位置,例如当你点击第2个item的时候,position的值就为1.(因为从0开始计数)                int posititonNum = position;                Intent intent = new Intent(MainActivity.this,SecondActivity.class);                intent.putExtra("extra_positionNum",posititonNum);//给下一个活动传参数positionNum                startActivity(intent);                //finish();             }        });    }    private void initPersonName(){        Person person1 = new Person();        person1.setName("gucheng");        personList.add(person1);        Person person2 = new Person();        person2.setName("myEgg");        personList.add(person2);    }}

这里,在ListView的点击事件里面,用Intent给下一个活动传递参数。使用函数putExtra(),函数里面有两个参数。第一个参数是作为一个key,给下一个活动当做一个钥匙来获取传递的数据。第二个参数才是传递的数据。

   //设置listView的点击事件        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                //这里position就表示的Person实例化对象在personList里面的位置,例如当你点击第2个item的时候,position的值就为1.(因为从0开始计数)                int posititonNum = position;                Intent intent = new Intent(MainActivity.this,SecondActivity.class);                intent.putExtra("extra_positionNum",posititonNum);                startActivity(intent);

二、关于怎么自定义ViewPAger适配器,在我上一篇博客里面:

http://blog.csdn.net/mygfz/article/details/53512490

1)在activity_second.xml中添加ViewPager控件:

 <android.support.v4.view.ViewPager        android:id="@+id/view_pager_second_activity"        android:layout_width="match_parent"        android:layout_height="wrap_content">    </android.support.v4.view.ViewPager>

2)写适配器子项布局second_activity_item.xml,只有两个控件。

 <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"/>

3)自定义适配器PersonSecondAdapter.java:

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){//销毁当前页卡        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){//实例化当前页卡        container.addView(viewList.get(itemPosition));//把我刚刚新建的view传进去        return viewList.get(itemPosition);    }}

4)SecondActivity.java添加代码。其中两个活动共用了一个Person类。

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);//接收Intent从上一个活动传递过来的数据        Intent intent = getIntent();        int positionNum = intent.getIntExtra("extra_positionNum",0);        initPerson();//初始化viewList        PersonSecondAdapter myAdapter = new PersonSecondAdapter(SecondActivity.this,viewList);        ViewPager myViewPager = (ViewPager)findViewById(R.id.view_pager_second_activity);        myViewPager.setAdapter(myAdapter);        try {            Field field = myViewPager.getClass().getField("mCurItem");            field.setAccessible(true);            field.setInt(myViewPager,positionNum);        }catch (Exception e){            e.printStackTrace();        }        myAdapter.notifyDataSetChanged();        myViewPager.setCurrentItem(positionNum);    } 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里面的数据添加到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;    }}

其中接收Intent从上一个活动传递过来的数据,传递过来的是int类型就用getIntExtra()函数,该函数的第二个参数是设置初始的页面。
传递的是String类型就用getStringExtra(),以此类推。

//接收Intent从上一个活动传递过来的数据        Intent intent = getIntent();        int positionNum = intent.getIntExtra("extra_positionNum",0);

然后是设置ViewPager跳转到特定的界面,一般用setCurrentItem()函数。

  myViewPager.setCurrentItem(positionNum);//positionNum就是你想要跳转的页面位置序号

以上。

欢迎交流。

0 0
原创粉丝点击