前言
做了一個仿今日頭條的頻道管理,雖然用別人寫好的庫,但是真正想去實現時發現了不少問題
- 如何把上面的TabLayout和下面的Viewpager關聯起來
- 當點擊添加時如何保存信息(下次進入時添加的頻道仍然存在)
- 如何加載不同的數據(根據什麼來判斷)
用到的第三方
maven { url "https://jitpack.io" }
compile 'com.github.andyoom:draggrid:v1.0.1'
到這就可以來寫自己的思路了。
佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="test.bawei.com.pindaoguanli.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<android.support.design.widget.TabLayout
android:layout_weight="1"
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="40dp"
app:tabMode="scrollable"
app:tabSelectedTextColor="#f00"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:tabPadding="5dp"></android.support.design.widget.TabLayout>
<Button
android:id="@+id/btn"
android:layout_width="40dp"
android:layout_height="40dp"
android:text="添"/>
</LinearLayout>
</RelativeLayout>
也很簡單只是實現Tablayout和添加的按鈕
在MainActivity裏面幾個重點部分:註釋已經很詳細了無非就是兩種情況的判斷:點擊添加頻道管理的按鈕和沒有點擊頻道管理的按鈕,而有沒有點擊頻道的按鈕又有兩個要處理:在Viewpager加載多少個fragment和給Tablayout設置幾個標題,最後只要把所有數據都保存到SharedPreferences裏。
private void LoadData() {
list = new ArrayList<>();
initDat1a();
// 創建Fragmnet對象
String str = sp.getString(TAB_DATA_KEY,null);
if(str==null){
for(int i=0;i<tabList.size();i++){
list.add(new Myfragment());
}
}else{
// 當我們點擊添加數據時通過解析保存的值來創建Fragmnet對象
List<ChannelBean> listAll= new Gson().fromJson(str, new TypeToken<List<ChannelBean>>() {
}.getType());
for(int i = 0;i<listAll.size();i++){
if (listAll.get(i).isSelect()){
list.add(new Myfragment());
}
}
}
//將Viewpager和Tablayout綁定
viewpage = new Viewpage(getSupportFragmentManager(),list);
pager.setAdapter(viewpage);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
tabLayout.setupWithViewPager(pager);
//通過判斷來個tablayout加載標題(點擊按鈕和未點擊按鈕)
if(str==null){
for(int i=0;i<tabList.size();i++){
tabLayout.getTabAt(i).setText(tabList.get(i).getName());
}
}else {
List<ChannelBean> listAll= new Gson().fromJson(str, new TypeToken<List<ChannelBean>>() {}.getType());
for(int i = 0;i<listAll.size();i++){
if (listAll.get(i).isSelect()==true)
tabLayout.getTabAt(i).setText(listAll.get(i).getName());
}
}
}
另外就是加載不同數據的問題:我是通過適配器用bundle把position傳過去通過位置來加載不同的頁面。
到這難點就解決了下面貼一下所有代碼方便理解
item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
item_list
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<TextView
android:id="@+id/titles"
android:text="GGGGGGGGGGGGGGGGGGGGGGGGGGG"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/imgs"
android:layout_width="match_parent"
android:layout_height="120dp"
android:background="@mipmap/ic_launcher"/>
</LinearLayout>
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TabLayout tabLayout;
private Button button;
private ViewPager pager;
private List<Fragment> list;
private Viewpage viewpage;
private final String TAB_DATA_KEY = "TabJson";
private List<ChannelBean> tabList;
private SharedPreferences sp;
private List<ChannelBean> tabListAll = new ArrayList<>();
private String jsonbeans;
List<String> urlList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用SharedPreferences來存儲記憶值
sp = getSharedPreferences(TAB_DATA_KEY,MODE_PRIVATE);
tabLayout = (TabLayout)findViewById(R.id.tab);
pager = (ViewPager)findViewById(R.id.page);
button = (Button)findViewById(R.id.btn);
button.setOnClickListener(this);
LoadData();
}
private void LoadData() {
list = new ArrayList<>();
initDat1a();
// 創建Fragmnet對象
String str = sp.getString(TAB_DATA_KEY,null);
if(str==null){
for(int i=0;i<tabList.size();i++){
list.add(new Myfragment());
}
}else{
// 當我們點擊添加數據時通過解析保存的值來創建Fragmnet對象
List<ChannelBean> listAll= new Gson().fromJson(str, new TypeToken<List<ChannelBean>>() {
}.getType());
for(int i = 0;i<listAll.size();i++){
if (listAll.get(i).isSelect()){
list.add(new Myfragment());
}
}
}
//將Viewpager和Tablayout綁定
viewpage = new Viewpage(getSupportFragmentManager(),list);
pager.setAdapter(viewpage);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
tabLayout.setupWithViewPager(pager);
//通過判斷來個tablayout加載標題(點擊按鈕和未點擊按鈕)
if(str==null){
for(int i=0;i<tabList.size();i++){
tabLayout.getTabAt(i).setText(tabList.get(i).getName());
}
}else {
List<ChannelBean> listAll= new Gson().fromJson(str, new TypeToken<List<ChannelBean>>() {}.getType());
for(int i = 0;i<listAll.size();i++){
if (listAll.get(i).isSelect()==true)
tabLayout.getTabAt(i).setText(listAll.get(i).getName());
}
}
}
@Override
public void onClick(View v) {
// 對點擊按鈕的判斷,如果沒有添加頻道則使用tabList裏面的默認數據 否則從SharedPreferences取出
LoadData();
String string = sp.getString(TAB_DATA_KEY, null);
if(string==null){
ChannelActivity.startChannelActivity(MainActivity.this,tabList);
}else{
ChannelActivity.startChannelActivity(MainActivity.this,string);
}
}
private void initDat1a() {
// 裝要添加的頻道true表示默認添加false表示點擊頻道後選擇要加入
tabList = new ArrayList<>();
tabList.add(new ChannelBean("推薦",true));
tabList.add(new ChannelBean("熱點",true));
tabList.add(new ChannelBean("北京",true));
tabList.add(new ChannelBean("社會",true));
tabList.add(new ChannelBean("頭條",true));
tabList.add(new ChannelBean("看點",true));
tabList.add(new ChannelBean("體育",true));
tabList.add(new ChannelBean("關注",false));
tabList.add(new ChannelBean("育兒",false));
tabList.add(new ChannelBean("購物",false));
tabList.add(new ChannelBean("分享",false));
tabList.add(new ChannelBean("NBA",false));
tabList.add(new ChannelBean("樂視",false));
}
//重寫回調監聽的方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode== ChannelActivity.REQUEST_CODE&&resultCode==ChannelActivity.RESULT_CODE)
{
jsonbeans = data.getStringExtra(ChannelActivity.RESULT_JSON_KEY);
//保存
sp.edit().putString(TAB_DATA_KEY,jsonbeans).commit();
//一定要寫在commit的下面
LoadData();
Log.e("requestCode","requestCode="+jsonbeans);
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
Myfragment
@ContentView(R.layout.item)
public class Myfragment extends Fragment {
@ViewInject(R.id.list)
private ListView listview;
private String path;
private List<User.ListBean> list;
private MyAdaper adaper;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view =x.view().inject(this,inflater,container);
list=new ArrayList<>();
Bundle bundle = getArguments();
int name = bundle.getInt("name");
path="http://wangyi.butterfly.mopaasapp.com/news/api?type=war&limit=30&page="+name;
adaper = new MyAdaper();
listview.setAdapter(adaper);
getDate();
return view;
}class MyAdaper extends BaseAdapter{
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView=View.inflate(getActivity(),R.layout.item_list,null);
TextView title= (TextView) convertView.findViewById(R.id.titles);
ImageView img= (ImageView) convertView.findViewById(R.id.imgs);
title.setText(list.get(position).getTitle());
x.image().bind(img,list.get(position).getImgurl());
return convertView;
}
}
private void getDate() {
RequestParams params = new RequestParams(path);
x.http().get(params, new Callback.CacheCallback<String>() {
@Override
public void onSuccess(String result) {
Gson gson = new Gson();
User user = gson.fromJson(result, User.class);
list.addAll(user.getList());
adaper.notifyDataSetChanged();
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
@Override
public boolean onCache(String result) {
return false;
}
});
}
}
ViewPager
public class Viewpage extends FragmentPagerAdapter {
private List<Fragment> list;
public Viewpage(FragmentManager fm,List<Fragment> list) {
super(fm);
this.list = list;
}
@Override
public Fragment getItem(int position) {
// 把位置傳過去
Bundle bundle = new Bundle();
bundle.putInt("name",position+1);
list.get(position).setArguments(bundle);
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
}
我用了Xutils3.0所以別忘了導入依賴庫和網絡權限
效果如圖