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