示例是如下图
这里写图片描述
代码如下
activity类
public class TopicDetailActivity extends BaseActivity implements ViewPager.OnPageChangeListener, RadioGroup.OnCheckedChangeListener {
//注解
@BindView(R.id.tv_title)
TextView tvTitle;
@BindView(R.id.cb_attention)
CheckBox cbAttention;
@BindView(R.id.rg_tab_topic)
RadioGroup rgTabTopic;
@BindView(R.id.view_line)
View viewLine;
@BindView(R.id.vp_content)
ViewPager vpContent;
List<Fragment> fragmentList = new ArrayList<>();
@Override
protected void initView() {
initLine();//改变上面的那条线的状态
initViewpager();
initRadioGroup();//布局切换
}
private void initRadioGroup() {
rgTabTopic.setOnCheckedChangeListener(this);
rgTabTopic.check(R.id.rb_new);
}
private void initViewpager() {
fragmentList.add(new TopicFragment());
fragmentList.add(new TopicFragment());
vpContent.setAdapter(new CursorPagerAdapter(getSupportFragmentManager(), fragmentList));
vpContent.addOnPageChangeListener(this);//设置一个监听
}
private void initLine() {
int with = getResources().getDisplayMetrics().widthPixels / 2;
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(with, ViewGroup.LayoutParams.MATCH_PARENT);
viewLine.setLayoutParams(params);
}
@Override
protected int getReslayout() {
return R.layout.activity_topic_detail;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//每次切换的时候改变线条
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) viewLine.getLayoutParams();
int with = getResources().getDisplayMetrics().widthPixels / 2;
int leftMargin = (int) (with * (position + positionOffset));
params.setMargins(leftMargin, 0, 0, 0);
viewLine.setLayoutParams(params);
}
@Override
public void onPageSelected(int position) {
//选择哪一个
rgTabTopic.check(position == 0 ? R.id.rb_new : R.id.rb_hot);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
vpContent.setCurrentItem(checkedId == R.id.rb_new ? 0 : 1);
}
}
fragment类
public class TopicFragment extends BaseFragment {
@BindView(R.id.lv_content)
ScrollListView lvContent;
@BindView(R.id.ptrsv)
PullToRefreshScrollView ptrsv;
@Override
protected void initView() {
}
@Override
public int getLayoutRes() {
return R.layout.fragment_topic;
}
}
BaseActivity 类
public abstract class BaseActivity extends AppCompatActivity{
{
MyApp.getInstance().addActivity(this);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getReslayout());
ButterKnife.bind(this);
initView();
initBack();
}
protected void initBack() {
ImageView ivBack = (ImageView) findViewById(R.id.iv_back);
if (ivBack !=null){//使用反射这里就可以不这样写
ivBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
protected abstract void initView() ;
protected abstract int getReslayout() ;
public void showToast(final String msg){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getBaseContext(), msg, Toast.LENGTH_SHORT).show();
}
});
}
public Activity getActivity(){
return this;
}
}
BaseFragment 类
public abstract class BaseFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View layout = View.inflate(getContext(), getLayoutRes(), null);
ButterKnife.bind(this, layout);
return layout;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView();
}
protected abstract void initView();
public abstract int getLayoutRes();
public void showToast(final String msg){
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(),msg,Toast.LENGTH_SHORT).show();
}
});
}
布局就不在这里搭建了fragment也可以用一个布局来实现,
主要是知道怎么去算那条线的偏移。