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

Design TabLayout+ViewPager+Fragment,实现选中请求数据+缓存

2015-11-01 16:10 465 查看
新建AndroidStudio工程

android.support.design.widget.TabLayout。

1.首先 compile ‘com.android.support:design:23.0.1’

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorColor="#F7FFAE00"
app:tabSelectedTextColor="#F7FFAE00"
app:tabTextColor="#EC000000"
app:tabMode="scrollable"
/>

<android.support.v4.view.ViewPager
android:id="@+id/view_page"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</LinearLayout>




这是主要的layout resource file,记得添加

xmlns:app=”http://schemas.android.com/apk/res-auto”

app:tabIndicatorColor=”#F7FFAE00” tab指示器颜色

app:tabSelectedTextColor=”#F7FFAE00” 被选中tab标题文字颜色

app:tabTextColor=”#EC000000” 未被选中tab标题文字颜色

app:tabMode=”scrollable” tab模式

2.接下来是Activity、Fragment、Adapter

package com.example.micyun.mytablayout;

import android.support.v4.app.Fragment;

/**
* Created by MicYun on 15/10/31.
*/
public abstract class LazyFragment extends Fragment {

protected boolean isVisible;//是否可见
/**
* 实现Fragment数据的懒加载(此方法在onCreateView()方法之前调用)
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);

if (getUserVisibleHint()) {

isVisible = true;

onVisible();

} else {

isVisible = false;

onInvisible();
}
}

/**
* 可见时调用lazyLoad()
*/
protected void onVisible() {

lazyLoad();

}

/**
* lazyLoad具体实现,继承该类的子Fragment去实现
*/
protected abstract void lazyLoad();

/**
* 不可见时,空实现
*/
protected void onInvisible(){}
}


具体 的注释代码里面有,这是实现选中后去请求数据的基础,网上像这样的例子还说满多的。

package com.example.micyun.mytablayout;

import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
* Created by MicYun on 15/10/31.
*/
public class MyFragment extends LazyFragment {

private static String TAG ="MyFragment";

public static String TARGET ="target";

private boolean isPrepared;//是否初始化完成

private LinearLayout linearLayout;//加载中视图

private TextView textView;

private String content;

static  MyFragment newInstance(String s) {

MyFragment mf = new MyFragment();

Bundle bundle = new Bundle();

bundle.putString(TARGET, s);

mf.setArguments(bundle);//Fragment传递数据方式

return mf;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.fragment_layout, null, false);

linearLayout = (LinearLayout) v.findViewById(R.id.load_linear);

textView = (TextView) v.findViewById(R.id.txt);

Bundle args = getArguments();

content = args.getString(TARGET);

isPrepared = true;

lazyLoad();

return v;
}

@Override
protected void lazyLoad() {

if (!isPrepared || !isVisible)
return;

new Handler().postDelayed(new Runnable() {
@Override
public void run() {

linearLayout.setVisibility(View.GONE);

textView.setVisibility(View.VISIBLE);

textView.setText("This is " + content + "Fragment");

}
}, 3000);

}
}


新建一个MyFragment,继承LazyFragment,并实现其方法lazyLoad(),请求服务器的逻辑在里面写。newInstance(String s)new新的MyFragment。

package com.example.micyun.mytablayout;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
* Created by MicYun on 15/10/31.
*/
public class MyViewPagerAdapter extends FragmentPagerAdapter {

private List<Fragment> list;

private String[] titles;

public MyViewPagerAdapter(FragmentManager fm, List<Fragment> list, String[] titles) {
super(fm);
this.list = list;
this.titles = titles;
}

@Override
public Fragment getItem(int position) {

return list.get(position);
}

@Override
public int getCount() {

return null != list ? list.size() : 0;
}

/**
* 一定要Override,否则TabLayout标题无文字
* @param position
* @return
*/
@Override
public CharSequence getPageTitle(int position) {

return titles[position];
}

}


给ViewPager新建一个适配器MyViewPagerAdapter

package com.example.micyun.mytablayout;

import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private TabLayout tabLayout;

private ViewPager viewPager;

private List<Fragment> list;

private MyViewPagerAdapter adapter;

private boolean isSelect;//是否选中

private String[] titles = new String[8];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tabLayout = (TabLayout) findViewById(R.id.tab_layout);

viewPager = (ViewPager) findViewById(R.id.view_page);

for (int i = 0; i < titles.length; i++) {

titles[i] = "Android" + i;
}

init();

}

private void init() {

list = new ArrayList<>();

list.clear();

for (int i = 0; i < titles.length; i++) {

list.add(MyFragment.newInstance("" + i));
}

//添加Tab标题
for (int i = 0; i < titles.length; i++) {

if (i == 0) {

isSelect = true;

} else {

isSelect = false;
}

tabLayout.addTab(tabLayout.newTab().setText(titles[i]), isSelect);

Log.i("Android", titles[i]);

}

if (null == adapter)
adapter = new MyViewPagerAdapter(getSupportFragmentManager(), list, titles);

viewPager.setAdapter(adapter);

//设置缓存View的个数
viewPager.setOffscreenPageLimit(titles.length - 1);

//关联TabLayout和ViewPager
tabLayout.setupWithViewPager(viewPager);

//Tab设置适配器
tabLayout.setTabsFromPagerAdapter(adapter);

}
}


初始化,包括TabLayout标题

String[] titles = new String[8];

为TabLayout添加标题

tabLayout.addTab(tabLayout.newTab().setText(titles[i]), isSelect);

MyFragment个数

MyFragment.newInstance(“” + i)

为ViewPager setAdapter

viewPager.setAdapter(adapter);

接下来就是比较关键的代码了

ViewPager和TabLayout的关联,其实很简单只要两行代码

tabLayout.setupWithViewPager(viewPager);

tabLayout.setTabsFromPagerAdapter(adapter);

TabLayout常用的方法:(摘抄至网络)

addTab(TabLayout.Tab tab, int position, boolean setSelected) 增加选项卡到 layout 中

addTab(TabLayout.Tab tab, boolean setSelected) 同上

addTab(TabLayout.Tab tab) 同上

getTabAt(int index) 得到index选项卡

getTabCount() 得到选项卡的总个数

getTabGravity() 得到 tab 的 Gravity

getTabMode() 得到 tab 的模式

getTabTextColors() 得到 tab 中文本的颜色

newTab() 新建个 tab

removeAllTabs() 移除所有的 tab

removeTab(TabLayout.Tab tab) 移除指定的 tab

removeTabAt(int position) 移除指定位置的 tab

setOnTabSelectedListener(TabLayout.OnTabSelectedListener onTabSelectedListener) 为每个 tab 增加选择监听器,稍候会讲解其回调方法

setScrollPosition(int position, float positionOffset, boolean updateSelectedText) 设置滚动位置

setTabGravity(int gravity) 设置 Gravity(fill填充,center居中)

setTabMode(int mode) 设置 Mode(设置可否滑动,scrollable可滑动)

setTabTextColors(ColorStateList textColor) 设置 tab 中文本的颜色

setTabTextColors(int normalColor, int selectedColor) 设置 tab 中文本的颜色 默认 选中

setTabsFromPagerAdapter(PagerAdapter adapter) 设置 PagerAdapter

setupWithViewPager(ViewPager viewPager) 和 ViewPager 联动
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android viewpager