您的位置:首页 > 移动开发 > Android开发

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

2014-04-10 23:43 399 查看
来自/article/3488076.html

一、简述

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

说明:

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
*
@paramtype
07
*
加载数据的类型
08
*
@returnFavoriteFragment实例
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构造方法

Avoidnon-defaultconstructorsinfragments:useadefaultconstructorplusFragment#setArguments(Bundle)instead。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: