前言:
Android中实现新闻类别展示功能的方法有很多,使用最多的应该是ViewpagerIndicator了,但是大多数的代码都是使activity继承的FragmentActivity来实现的,但是这样感觉不利于代码的扩展,所以在这里我使Activity继承Activity来实现。不过现在也可以使用TabLayout,而不是用viewpagerindicator来实现了,但是这里我只想使用ViewPagerIndicator(下面简称indicator)来实现,不过是在继承Activity情况下使用,下面主要介绍indicator的实现,先看效果图:
1、demo分析
这里我使用的是三个Fragment,在其中一个Fragment中集成indicator,当然这种在Fragment中集成indicator的示例网上随便搜索都是一大把的,但是网上的基本上都是使用的Fragment依赖的activity是继承的FragmentActivity,对于我来说,我就不喜欢集成FragmentActivity,所有项目中我使Fragment依赖的activity集成的是Activity,再这种情况下实现indicator,分析就到这里,下面看代码分析。
2、代码分析
①activity中代码就不用贴了吧,这个只要在网上搜Fragment就有一大把的代码,这里就贴一些主要的:
顺带看一下我MainActivity这里继承的是Activity而不是FragmentActivity:
public class MainActivity extends Activity {
private RadioButton test1radio, test2radio, test3radio;
private BaseFragment test1fragment, test2fragment, test3fragment;
private ArrayList<BaseFragment> fragmentlists;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
ShowFragment(0);
}
/**
* 显示选中的fragment
*
* @param i
*/
private void ShowFragment(int i) {
FragmentTransaction fragmentTransaction =
getFragmentManager().beginTransaction();
HideFragment();
switch (i) {
case 0:
if (test1fragment == null) {
test1fragment = new Test1Fragment();
fragmentTransaction.add(R.id.activity_main_frame, test1fragment).commit();
fragmentlists.add(test1fragment);
} else {
fragmentTransaction.show(test1fragment).commit();
}
break;
case 1:
if (test2fragment == null) {
test2fragment = new Test2Fragment();
fragmentTransaction.add(R.id.activity_main_frame, test2fragment).commit();
fragmentlists.add(test2fragment);
} else
fragmentTransaction.show(test2fragment).commit();
break;
case 2:
if (test3fragment == null) {
test3fragment = new Test3Fragment();
fragmentTransaction.add(R.id.activity_main_frame, test3fragment).commit();
fragmentlists.add(test3fragment);
} else
fragmentTransaction.show(test3fragment).commit();
break;
}
}
public class Test1Fragmentextends BaseFragment {
private staticfinal String[] TITLE =
new String[]{"Android","ios","科技","娱乐","热点","体育","彩票","视频","直播","历史","财经","本地","博客"};
private ViewPager mViewpager;
private TabPageIndicator mTabindicator;
private mPagerAdapter mPagerAdapter;
@Override
public View initView(LayoutInflater inflater) {
View inflate = inflater.inflate(R.layout.fragment_test1, null);
mViewpager = (ViewPager) inflate.findViewById(R.id.fragment_test1_viewpager);
mTabindicator = (TabPageIndicator) inflate.findViewById(R.id.fragment_test1_indicator);
return inflate;
}
@Override
public void initData() {
super.initData();
//如果是网络请求的可以在这里访问网络请求,然后就TITLE替换成网络数据
mPagerAdapter = new mPagerAdapter(mActivity, TITLE);
mViewpager.setAdapter(mPagerAdapter);
mTabindicator.setVisibility(View.VISIBLE);//需要注意的是,在布局中indicator最好设置为gone,然后在显示的时候设置visible,不然有可能会报错
mTabindicator.setViewPager(mViewpager);
}
③到现在为止这里所有的代码都是没有什么差别的啊,和网上的大部分都一样的啊,所以区别就在Adapter中,我们这里是使用的自定义的Adapter,因为我们的MainActivity是集成的Activity,所有没有FragmentPagerAdapter这个适配器,而网上的都是使Activity集成了FragmentActivity,所以他们的适配器都是使用的FragmentPagerAdapter,这里有不懂的可以去搜一下集成FragmentActivity的使用,相信有很多答案。这里就看一下自定义Adapter中的代码,其实和普通集成PagerAdapter的没什么两样,只是我们这里多实现了一个getPageTitle方法,代码如下。
public class mPagerAdapterextends PagerAdapter {
private Activity mActivity;
private String[] mTitle;
public mPagerAdapter(Activity activity, String[] title) {
super();
this.mActivity = activity;
this.mTitle = title;
}
@Override
public int getCount() {
return mTitle.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container,int position, Object object) {
container.removeView((View) object);
}
@Override
public Object instantiateItem(ViewGroup container,int position) {
ViewPagerItem pager = new ViewPagerItem(mActivity, mTitle[position]);
View mView=pager.initView();
container.addView(mView);
pager.initData();//调用显示每一个item的数据
return mView;
}
//这里就是用来显示indicator中的数据的
@Override
public CharSequence getPageTitle(int position) {
return mTitle[position];
}
}
④在上面代码中,需要注意的是instantiateItem方法,平时这里的需要的View我们是直接在数组中获得的,但是这里我们只有string类型的数据,所有这里我们需要自己定义一个view,用来显示indicator对应类别的数据,先看一下代码。
/**
* Class Discription :这里可以用来显示每一个title对应的详情界面
* Created User : Even
* Created Time : 2016/08/23.
*/
public class ViewPagerItemextends BaseViewpager {
private String title;
private TextView textView;
public ViewPagerItem(Activity activity, String title) {
super(activity);
this.title = title;
}
@Override
public View initView() {
//
View inflate = View.inflate(mActivity, R.layout.viewpager_item, null);
textView = (TextView) inflate.findViewById(R.id.viewpager_item_text);
// textView = new TextView(mActivity);
// textView.setTextSize(40);
// textView.setTextColor(mActivity.getResources().getColor(R.color.black));
return inflate;
}
/**
* 可以在这里根据indicator传进来的类别请求API数据
*/
@Override
public void initData() {
//这里只是显示出indicator传过来的title,可以在这里请求API,用来显示API返回来的数据
textView.setText(title);
}
}
⑤只要实现这些,就可以在activity不继承Fragment时候,使用viewpagerindicator了,这里部分简单代码没有贴出,上面贴的是demo的主要代码,如果有需要的,可以通过下面链接下载:demo下载
Android技术交流群:284128443