我們要做的是在Activity中加入一個ViewPager,利用ViewPager的適配器(繼承於FragmentPagerAdapter)將Fragment加到其中,而我們在又在Fragment中又加入了一個ListVIew,這又要一個繼承與BaseAdapter的適配器。
當我們滑動ViewPager時,頂欄也聯動滑動,這需要一個第三方組件,PagerSlidingTabStrip。導包等一系列步驟暫不說明。
1、首先,建立一個Activity,里面有ViewPager和PagerSlidingTabStrip
代碼如下:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import com.astuetz.PagerSlidingTabStrip;
import com.example.administrator.homeworepar.Fragment.adapter.MyFragmentAdapter;
import com.example.administrator.homeworepar.Fragment.adapter.PagerFragment;
import com.example.administrator.homeworepar.R;
import java.util.ArrayList;
import java.util.List;
public class FragmentPagerActivity extends AppCompatActivity {
private ViewPager vp;
private PagerSlidingTabStrip pst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_pager);
vp= (ViewPager) findViewById(R.id.vp);
pst=(PagerSlidingTabStrip)findViewById(R.id.pst);
List<Fragment> list=new ArrayList<>();
List<String> titles=new ArrayList<>(); //設置頂欄
titles.add("體育");
titles.add("娛樂");
titles.add("財經");
titles.add("國際");
titles.add("奧運");
for(int i=1;i<=5;i++){ //Bundle的作用為在Activity和Fragment中傳值
Fragment fragment=new PagerFragment();
Bundle bundle=new Bundle();
bundle.putInt("arg",i);
fragment.setArguments(bundle);
list.add(fragment);
}
MyFragmentAdapter ma=new MyFragmentAdapter( //適配器名稱
getSupportFragmentManager(),list,titles);
vp.setAdapter(ma);
pst.setIndicatorColor(getResources().getColor(R.color.colorPrimary)); //頂欄的各種屬性
pst.setIndicatorHeight(3);
pst.setUnderlineColor(getResources().getColor(R.color.colorAccent));
pst.setTextColor(getResources().getColor(R.color.colorPrimary));
pst.setDividerColor(getResources().getColor(R.color.color1));
//pst.setShouldExpand(true); 當標題過少時,可以設置標題均分標題欄
// pst.setTabBackground(5);
pst.setViewPager(vp);
}
}
MyFragmentAdapter 適配器
把Fragment放到ViewPager
public class MyFragmentAdapter extends FragmentPagerAdapter {
private List<Fragment> list;
private List<String> titles;
public MyFragmentAdapter(FragmentManager fm,List<Fragment> list,List<String> titles) {
super(fm);
this.list=list;
this.titles=titles;
}
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
}
再把ListView放到Fragment中,Fragment中建立一個ListView,在ListView中放一個NewsOne類,
還需要一個適配器,擴展BaseAdapter,作用是把新聞類數據傳到ListView中
Fragment中的代碼如下:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import com.example.administrator.homeworepar.R;
import java.util.ArrayList;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
*/
public class PagerFragment extends Fragment {
public PagerFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_pager, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ListView lv= (ListView) getView().findViewById(R.id.lv);
List<NewsOne> list=new ArrayList<>(); //將新聞類放到Fragment中
MyListViewAdapter ma=new MyListViewAdapter(list,getActivity());
lv.setAdapter(ma);
Bundle bundle=getArguments();
if(bundle!=null){
int arg= bundle.getInt("arg");
switch (arg){
case 1: //將Bundle傳來的值得到,設置五個左右滑動的頁面
for(int i=1;i<20;i++){
list.add(new NewsOne(R.mipmap.image12,"剛剛","體育新聞"+i));
}
ma.notifyDataSetChanged();
break;
case 2:
for(int i=1;i<20;i++){
list.add(new NewsOne(R.mipmap.image12,"剛剛","奧運集錦"+i));
}
ma.notifyDataSetChanged();
break;
case 3:
for(int i=1;i<20;i++){
list.add(new NewsOne(R.mipmap.image12,"剛剛","國際新聞"+i));
}
ma.notifyDataSetChanged();
break;
case 4:
for(int i=1;i<20;i++){
list.add(new NewsOne(R.mipmap.image12,"剛剛","財經新聞"+i));
}
ma.notifyDataSetChanged();
break;
case 5:
for(int i=1;i<20;i++){
list.add(new NewsOne(R.mipmap.image12,"剛剛","國內新聞"+i));
}
ma.notifyDataSetChanged();
break;
}
}
}
}
名為MyListViewAdapter的適配器,作用是將News類加到Fragment中
package com.example.administrator.homeworepar.Fragment.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.administrator.homeworepar.R;
import java.util.List;
/**
* Created by Administrator on 2016/8/9.
*/
public class MyListViewAdapter extends BaseAdapter {
private List<NewsOne> list;
private Context context;
public MyListViewAdapter(List<NewsOne> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh;
if(convertView==null){
vh=new ViewHolder();
convertView= LayoutInflater.from(context).inflate(R.layout.list_layout,null);
vh.img=(ImageView)convertView.findViewById(R.id.img);
vh.title=(TextView)convertView.findViewById(R.id.title);
vh.pubdate=(TextView)convertView.findViewById(R.id.pubDate);
convertView.setTag(vh);
}else{
vh=(ViewHolder)convertView.getTag();
}
NewsOne newsOne=list.get(position);
vh.img.setImageResource(newsOne.getImg());
vh.title.setText(newsOne.getTitle());
vh.pubdate.setText(newsOne.getPubDate());
return convertView;
}
private class ViewHolder{
ImageView img;
TextView title;
TextView pubdate;
}
}