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.
五:效果
…可能是我对于源码没搞明白…才会出现我以上说的第四点
以上就是一种简单的频道管理实现方式…
望有所助…