前言

最近开发的项目中有类似网易新闻的频道管理,在完成项目后,我将频道管理单独抽取成Library,方便以后开发,也把总结到的一点知识分享出来。先看看,我的频道管理有什么特点吧。

特点

1.支持固定频道,支持排序,删除。删除,添加皆有动画效果。

2.在排序完成后,通过刷新Adapter而不是重新创建Adapter,性能更好,没有卡顿。

3.使用简单方便,Library中已经封装了数据库操作,获取需要显示的数据只需要一行代码即可

  final List<MyChannel> showChannels = dataHelepr.getShowChannels(alldata);

集成

1.添加channellib到你的项目

2.让你的JavaBean实现ChannelEntityCreater接口

import com.trs.channellib.channel.channel.ChannelEntity;/*** Created by zhuguohui on 2016/5/12.*/
public class MyChannel implements ChannelEntity.ChannelEntityCreater {...@Overridepublic ChannelEntity createChannelEntity() {ChannelEntity entity=new ChannelEntity();//是否是固定频道entity.setFixed(isFix==1);//显示的名称entity.setName(title);return entity;}
}

3.在你的Activity中示例化ChannelDataHelepr,注意ChannelDatahelper需要一个泛型参数,即你用来表示频道的JavaBean

    ChannelDataHelepr<MyChannel> dataHelepr;dataHelepr = new ChannelDataHelepr(this, this, findViewById(R.id.top_bar));

构造函数声明如下,第一个为上下文,第二个为用来相应频道管理的监听器,第三个为需要将频道管理显示在哪个控件下方。

    public ChannelDataHelepr(@NonNull Context context, @NonNull ChannelDataRefreshListenter channelDataRefreshListenter, @NonNull View showView) 

ChannelDataRefreshListenter 声明

    public static interface ChannelDataRefreshListenter {//此方法为刷新数据的方法,只有在频道发生变化的时候才会触发public void updateData();//此方法为,点击频道中的item时触发,可根据是否有更新选择,ViewPager切换的时机public void onChannelSeleted(boolean update, int posisiton);}

如我的Activity中这两个方法的实现

@Overridepublic void updateData() {loadData();}@Overridepublic void onChannelSeleted(boolean update,final int posisiton) {//如果频道没有改变,则立即调整,否则记录下需要调整的position,在数据更新后调整if(!update) {viewPager.setCurrentItem(posisiton);}else {needShowPosition=posisiton;}}

4.设置用于触发频道管理的View

 dataHelepr.setSwitchView(switch_view);

5.在每次数据加载完成后,过滤一遍,只显示订阅的频道。

  private void loadData() {new Thread(new Runnable() {@Overridepublic void run() {String data = getFromRaw();List<MyChannel> alldata = GsonUtil.jsonToBeanList(data, MyChannel.class);//过滤数据,如果有新的频道会自动订阅并保存到数据库。final List<MyChannel> showChannels = dataHelepr.getShowChannels(alldata);runOnUiThread(new Runnable() {@Overridepublic void run() {myChannels.clear();myChannels.addAll(showChannels);adapter.notifyDataSetChanged();if(needShowPosition!=-1){viewPager.setCurrentItem(needShowPosition);needShowPosition=-1;}}});}}).start();}

6.为了实现Adapter可以重排序,需要这样实现Adpater,关于原理可以查看我之前的一篇博客ViewPager重排序与更新

public class TitleFragmentAdapter extends FragmentPagerAdapter {List<MyChannel> channels;int id=1;Map<String,Integer> IdsMap=new HashMap<>();List<String> preIds=new ArrayList<>();public TitleFragmentAdapter(FragmentManager fm,@NonNull List<MyChannel> channels) {super(fm);this.channels=channels;}@Overridepublic Fragment getItem(int position) {SimpleTitleFragment fragment=new SimpleTitleFragment();Bundle bundle=new Bundle();bundle.putString(SimpleTitleFragment.KEY_TITLE,channels.get(position).getTitle());bundle.putString(SimpleTitleFragment.KEY_URL,channels.get(position).getUrl());fragment.setArguments(bundle);return fragment;}@Overridepublic int getCount() {return channels.size();}@Overridepublic CharSequence getPageTitle(int position) {return channels.get(position).getTitle();}@Overridepublic long getItemId(int position) {return IdsMap.get(getPageTitle(position));}@Overridepublic int getItemPosition(Object object) {SimpleTitleFragment fragment= (SimpleTitleFragment) object;String title=fragment.getTitle();int preId = preIds.indexOf(fragment.getTitle());int newId=-1;int i=0;int size=getCount();for(;i<size;i++){if(getPageTitle(i).equals(fragment.getTitle())){newId=i;break;}}if(newId!=-1&&newId==preId){return POSITION_UNCHANGED;}if(newId!=-1){return newId;}return POSITION_NONE;}@Overridepublic void notifyDataSetChanged() {for(MyChannel info:channels){if(!IdsMap.containsKey(info.getTitle())){IdsMap.put(info.getTitle(),id++);}}super.notifyDataSetChanged();preIds.clear();int size=getCount();for(int i=0;i<size;i++){preIds.add((String) getPageTitle(i));}}
}

关于频道管理控件的实现可以查看这里
使用ItemTouchHelper高效地实现 今日头条 、网易新闻 的频道排序、移动
我在这个控件的基础上,添加了固定频道的功能,需要注意的是,使用这个控件时其父容器必须是FrameLayout否则会出现动画异常的情况。

下载

https://github.com/zhuguohui/ChannelMangerDemo

Android频道管理集成相关推荐

  1. android新闻管理,Android资讯新闻类App(头条、网易等),频道管理集成之数据库存储...

    Android资讯新闻类App(头条.网易等),频道管理集成之数据库存储 发布时间:2019-01-16 19:55, 浏览次数:305 , 标签: Android App * 经常看新闻类的大家都知 ...

  2. Android资讯新闻类App(头条、网易等),频道管理集成之数据库存储

    经常看新闻类的大家都知道这个频道管理. 图片转载https://blog.csdn.net/u011916937/article/details/50483278 我这里是用的Github,开源项目, ...

  3. Android 频道管理仿今日头条

    导入依赖 在项目的build.gradle导入 allprojects {repositories {jcenter() //下面这一行就是 maven { url "https://jit ...

  4. Android 频道管理,可拖动item排列,删除,添加

    样式效果           1.创建自定义GridView /*** 作者:created by meixi* 邮箱:15913707499@163.com* 日期:2019/5/31 13*/pu ...

  5. Android 仿今日头条、网易新闻的频道管理

    最近做新闻类型的项目,用到了频道管理,点击删除排序,拖动排序.来分享一下 下面上代码: MainActivity 布局 <?xml version="1.0" encodin ...

  6. Android 仿今日头条频道管理(下)(GridView之间Item的移动和拖拽)

    前言 上篇博客我们说到了今日头条频道管理的操作交互体验,我也介绍了2个GridView之间Item的相互移动.详情请參考:Android 仿今日头条频道管理(上)(GridView之间Item的移动和 ...

  7. Android仿头条频道管理

    XML文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...

  8. 使用 draggrid 实现 仿今日头条频道管理(详细步骤)

    Android 中   使用 draggrid 实现仿今日头条频道管理(详细步骤) 前言 最近开发的项目中有类似今日头条新闻的频道管理,用的是第三方的draggrid  所以试着尝试做了一下.代码如下 ...

  9. 新闻频道管理的炫酷实现

    新闻频道管理的炫酷实现 自定义GridLayout控件,可以在新闻咨询类APP中的管理页面使用到,也可以应用在类别管理中,总之,可以帮助我们设计更加规范和炫酷的手机页面. 新闻类app是最常见的应用之 ...

最新文章

  1. 部署IPV6有什么好处?
  2. 里氏替换原则→类型转换
  3. 关于source insight 置顶窗口或者处于前台挡住窗口解决办法
  4. 【转】linux su和sudo命令的区别——百度知道
  5. 最佳适应算法模拟内存分配
  6. visual 对话框之间调用_两套S71200之间实现S7通讯的方法
  7. 基于aspectj实现AOP操作的两种方式——xml配置
  8. 我也来说说Dynamic
  9. mybatis-批量操作
  10. MyBatis配置:在控制台打印SQL语句
  11. java bean的反射类_JAVA中反射机制五(JavaBean的内省与BeanUtils库)
  12. 回答一个微信好友的创业问题
  13. 收藏 | 深度学习之Numpy基础入门教程!
  14. PAT乙级 1013 数素数
  15. 源代码安装httpd服务器
  16. 打开多网页用服务器系统好吗,如何在打开多个网页后,只需在一个网页上操作,其他网页都会同步操作?...
  17. 大数据之多数据源综合管理系统:数据源配置管理
  18. 【Download error:TOO MANY REQUESTS】【TypeError:excepted string or buffer】
  19. hdu 6184 Counting Stars
  20. Python:PDF文件处理(数据处理)

热门文章

  1. ubuntu16.04安装nginx,nignx-rtmp-mpdule,ffmeg,搭建rtmp服务器
  2. FPGA设计中BRAM(Block RAMs)资源的使用(综合为BRAM)
  3. c++ <algorithm> swap 函数 reverse 函数 remove 函数
  4. 移动端h5落地页总结(vue cli+vant)
  5. 针尖上带着脚镣跳舞的widget
  6. 用html和css做动态动物,分享9款用HTML5/CSS3制作的动物、人物动画
  7. Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines 论文研读
  8. 苹果4K调色非编系统的一些事儿
  9. 码率多少算是正常的1080p_4K时代的1080P优派THD825家庭影院投影机值得买吗?
  10. Twitter Snowflake 主键生成