Android中的频道管理

Android 频道管理的简单实现方式

较为简单的实现方式:

一. 导入依赖
1. 找到我们 Gradle 下的 含有(root) 然后F4打开配置:

 allprojects {
     repositories {
    google()
    jcenter()
    //这一行就是我们所需要导入的依赖:
    maven {url "https://jitpack.io"}
}
}

2.然后找到我们 Gradle 下的 Module的 配置(同样为F4):

dependencies {
//添加依赖
compile 'com.github.andyoom:draggrid:v1.0.1'
}

二:布局文件
采用简单的相对布局就可以:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    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"
    tools:context=".MainActivity">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content">

        </android.support.design.widget.TabLayout>
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="+"/>
    </LinearLayout>
    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

三. 代码的实现
简单来说:
大致可以依据我们的控件数量来想, Button + TabLayout +ViewPager;
创建可以放置Fragment的集合 + 含有标题栏的字符串集合(当然这里被ChannelBean这个集合所代替);
初始化数据的时候,根据ChannelBean的长度遍历添加Fragment;
按模拟器返回键时利用我们所导的依赖(内部自动含有封装好的Gson),直接onActivityResult方法中的第三个参数值–data–来获取值就好了.

public class MainActivity extends AppCompatActivity {

private ViewPager viewpager;
private TabLayout tablayout;
private Button button;
ArrayList<ChannelBean> channelBeanslist = new ArrayList<ChannelBean>();
ArrayList<Fragment> fragmentslist = new ArrayList<Fragment>();
private MyAdapter m;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //初始化组件
    viewpager = findViewById(R.id.viewPager);
    tablayout = findViewById(R.id.tabLayout);
    button = findViewById(R.id.button);

    //初始化数据
    initData();

    //viewpager适配器
    m = new MyAdapter(getSupportFragmentManager());
    viewpager.setAdapter(m);
    //设置模式(两种)TabLayout.MODE_SCROLLABLE和MODE_FIXED;
    tablayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    //同事设置TabLayout与ViewPager组件的相连接.
    tablayout.setupWithViewPager(viewpager);

    //点击事件
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //上下文和ChannelBean的集合
            ChannelActivity.startChannelActivity(MainActivity.this,channelBeanslist);
        }
    });

}

class MyAdapter extends FragmentPagerAdapter{

    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        return fragmentslist.get(i);
    }

    @Override
    public int getCount() {
        return fragmentslist.size();
    }

    @Nullable
    @Override
    //需要手动添加
    public CharSequence getPageTitle(int position) {
        return channelBeanslist.get(position).getName();
    }
}
private void initData() {

    channelBeanslist.add(new ChannelBean("推荐",true));
    channelBeanslist.add(new ChannelBean("热门",true));
    channelBeanslist.add(new ChannelBean("美女",false));
    channelBeanslist.add(new ChannelBean("游戏",false));
    for (int i = 0; i < channelBeanslist.size(); i++) {
        ChannelBean channelBean = channelBeanslist.get(i);
        if (channelBean.isSelect()){
            String name = channelBean.getName();
            tablayout.addTab(tablayout.newTab().setText(name));
            if (i == 0){
                fragmentslist.add(new Tuijian());
            }else if(i == 1){
                fragmentslist.add(new Remen());
            }else{
                fragmentslist.add(new Blank());
            }
        }
    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //根据静态string常量获得返回的json值:
    String stringExtra = data.getStringExtra(ChannelActivity.RESULT_JSON_KEY);
    Type type = new TypeToken<ArrayList<ChannelBean>>() {
    }.getType();
    Gson gson = new Gson();
    channelBeanslist  = gson.fromJson(stringExtra, type);
    //清除(tablayout+fragmentslist)数据
    tablayout.removeAllTabs();
    fragmentslist.clear();
    //遍历channelBeanslist重新加入导航栏的数量,进行添加Fragment布局
    for (int i = 0; i < channelBeanslist.size(); i++) {
        ChannelBean channelBean = channelBeanslist.get(i);
        if (channelBean.isSelect()){
            String name = channelBean.getName();
            tablayout.addTab(tablayout.newTab().setText(name));
            if ("推荐".equals(name)){
                fragmentslist.add(new Tuijian());
            }else if("热门".equals(name)){
                fragmentslist.add(new Remen());
            }else{
                fragmentslist.add(new Blank());
            }
        }
    }
    //提醒适配器改变
    m.notifyDataSetChanged();
}
}

四:
有个需要注意的地方:
首先:
我们默认的标签数量为2(这个依赖默认前两个标签不可以更换),如果我们默认添加三个标签(就是channelBeanslist.add的时候,后面我写了个true),其余全部添加相同的Fragment,这时候我们来回更换第三个标签,我们会发现第三个标签所搭配的Fragment不会跟标签的改变而改变. 可能只适合默认两个标签使用.
其次:
点击按钮之后,选择切换标签的时候,我的频道中的标签不可以长按,(单击增删频道,长按拖拽排序,我的app反正是崩溃了)…否则app崩溃.(可能某些客户网速过慢,长按半天你的APP崩溃了,what,什么鬼?)
…如果Fragment嵌套过多的话,onActivityResult方法是给不到你的Fragment的,你需要在你自己所依赖的Activity上,才可以找到你自己的Fragment.

五:效果
在这里插入图片描述

在这里插入图片描述
…可能是我对于源码没搞明白…才会出现我以上说的第四点

以上就是一种简单的频道管理实现方式…
望有所助…

猜你喜欢

转载自blog.csdn.net/qq_43589739/article/details/84336476