开源中国Android客户端-使用Tab切换Fragment

来自 http://my.oschina.net/xsjayz/blog/142593

一、简述

在开源中国客户端中,使用了大量的列表去加载新闻、咨询、博客等等内容,而根据合理的分类,又可以使得这些列表显示的样式保持一致。

说明:

    1)、可以左右滑动切换,更方便。

    2)、左右切换的时候,不去刷新,采用的是每个页面单独下拉刷新。  

例如,我的收藏夹:

        

在我的收藏夹,总共有5个Tab,也可以说需要切换5个视图,这些视图完全一样,只是数据大小不一。

1、第一种处理办法:使用5个不同的Fragment

    添加5个不同的Fragment,由于它们几乎一样,所以只要写好一个,就可以复制4个了。每个Fragment分别加载自己的内容。

缺点:需要写大量重复的代码,即使我这个新手,凭直觉也认为十分不妥!

2、第二种处理办法:使用一个公共的Fragment

    使用一个Fragment,显示不同的内容,这应该是合理而又可行的。

    这是我的思路:

    2.1、收藏Activity:UserFavoriteActivity

   一个普通的Activity,继承了Osc客户端的Base: 

01 public class UserFavoriteActivity extends OscBaseActivity {
02  
03     private MyViewPager mViewPager = null;
04  
05     @Override
06     protected void onCreate(Bundle savedInstanceState) {
07         requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
08  
09         super.onCreate(savedInstanceState);
10         setContentView(R.layout.viewpager_layout);
11  
12         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
13         getSupportActionBar().setTitle(R.string.user_favorite_title);
14  
15         mViewPager = (MyViewPager) findViewById(R.id.viewpager);
16         UserFriendPagerAdapter ufAdapter = new UserFriendPagerAdapter(
17                 getSupportFragmentManager());
18         mViewPager.setOffscreenPageLimit(5);
19         mViewPager.setAdapter(ufAdapter);
20         mViewPager.setOnPageChangeListener(onPageChangeListener);
21  
22         ActionBar actionBar = getSupportActionBar();
23         actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
24         actionBar.addTab(actionBar.newTab()
25                 .setText(getString(R.string.user_favorite_software))
26                 .setTabListener(tabListener));
27         actionBar.addTab(actionBar.newTab()
28                 .setText(getString(R.string.user_favorite_post))
29                 .setTabListener(tabListener));
30         actionBar.addTab(actionBar.newTab()
31                 .setText(getString(R.string.user_favorite_code))
32                 .setTabListener(tabListener));
33         actionBar.addTab(actionBar.newTab()
34                 .setText(getString(R.string.user_favorite_blog))
35                 .setTabListener(tabListener));
36         actionBar.addTab(actionBar.newTab()
37                 .setText(getString(R.string.user_favorite_news))
38                 .setTabListener(tabListener));
39     }
40 // ......

 以上部分代码,设置Actionbar的模式为Tab,并初始化了5个Tab,设置标题,并使用ViewPager切换。

2.2、给FavoriteFragment设置不同的Type,用于加载不同的数据:

    FavoriteFragment的部分代码:

    在创建FavoriteFragment实例的时候,把异步处理请求数据的Type传递进去,然后返回该实例对象。

    在getArgumentsType()方法中,获取传递的Type,默认为第一项。

01 public class FavoriteFragment extends SherlockListFragment {
02  
03     /**
04      * 返回FavoriteFragment实例
05      *
06      * @param type
07      *            加载数据的类型
08      * @return FavoriteFragment实例
09      */
10     public static FavoriteFragment newInstance(int type) {
11         FavoriteFragment ff = new FavoriteFragment();
12         Bundle bundle = new Bundle();
13         bundle.putInt("type", type);
14         ff.setArguments(bundle);
15         return ff;
16     }
17  
18     public int getArgumentsType() {
19         return getArguments().getInt("type", FavoriteList.TYPE_SOFTWARE);
20     }
21  
22 // ......
23  
24 }

2.3、异步处理:加载数据

01 /**
02  * 加载数据AsyncTask
03  */
04 private class GetFansTask extends AsyncTask<String, Void, FavoriteList> {
05  
06     @Override
07     protected FavoriteList doInBackground(String... params) {
08         // 当前pageIndex
09         int pageIndex = lvSumData / 20;
10         // 获取type
11         int type = getArgumentsType();
12         try {
13             // 调用OsChina客户端源代码去请求数据
14             return appContext.getFavoriteList(type, pageIndex, true);
15  
16         catch (AppException e) {
17             e.printStackTrace();
18         }
19         return null;
20     }
21  
22     @Override
23     protected void onPostExecute(FavoriteList result) {
24         super.onPostExecute(result);
25  
26         List<Favorite> friendList = result.getFavoritelist();
27  
28         // 处理加载回来的数据
29         // ......  
30              
31     }
32 }

经过这几步的处理,终于实现了想要的效果,即前面的截图。

3、第三种处理办法:更好的处理办法

    前面2种,只是抛砖引玉,希望大家给出更好的处理办法,达到共同学习的目的。

 

二、说明

1、设计

    Android官方设计规范中,不要在ListView的右侧添加一个小箭头(IOS设计风格害人不浅~~)。

    

2、Fragment构造方法

Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead。


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值