https://www.jianshu.com/p/4a77ae4cd82f
关于CoordinatorLayout 的写的很好了,有空自己总结一个
记录一下自己对微博个人主页的做法:
先咕会儿,准备直接做databinding
-
首先是布局:
然后做一个只有recycler的布局,用于做pager
具体xml:
- 创建一个pager的adapter
因为这里每个fragment都需要userID的参数,所以在初始化的参数里加了userID
public class UserPagerAdapter extends FragmentPagerAdapter {
long userID;
private static final String[] TAB_TITLES = new String[]{"主页","微博","相册"};
public UserPagerAdapter(@NonNull FragmentManager fm, int behavior, long userID) {
super(fm, behavior);
this.userID = userID;
}
@Override
public Fragment getItem(int position) {
return UserPlaceholderFragment.newInstance(position + 1,userID);
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return TAB_TITLES[position];
}
@Override
public int getCount() {
return TAB_TITLES.length;
}
对于UserPlaceholderFragment.newInstance为返回新建的一个fragment
新建使用的的函数如下,采用index来当做fragment的标识,userID是上面传进去的userID,userID通过adapter传进fragment里(其实也可以用父fragment的viewmodel)
创建的时候用打包bundle把index和其他需要的数据放入fragment自带的Argument里
public static UserPlaceholderFragment newInstance(int index, long userID) {
UserPlaceholderFragment fragment = new UserPlaceholderFragment();
Bundle bundle = new Bundle();
bundle.putInt(ARG_SECTION_NUMBER, index);
bundle.putLong(ARG_ID, userID);
fragment.setArguments(bundle);
return fragment;
}
fragment在创建的时候从自己的argument里获得index和其他数据(userID),这里同时创建了一个与该子fragment绑定的UserPlaceholderViewModel,用于存放index和其他需要操作的数据。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
userID = getArguments().getLong(ARG_ID);
viewModel = new ViewModelProvider(this).get(UserPlaceholderViewModel.class);
viewModel.setUserID(String.valueOf(userID));
int index;
if (getArguments() != null) {
index = getArguments().getInt(ARG_SECTION_NUMBER);
} else {
index = 1;
}
viewModel.setIndex(index);
}


