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

这几天因为项目需求,要实现,点击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就是你想要跳转的页面位置序号

以上。

欢迎交流。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值