Android频道管理集成
前言
最近开发的项目中有类似网易新闻的频道管理,在完成项目后,我将频道管理单独抽取成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频道管理集成相关推荐
- android新闻管理,Android资讯新闻类App(头条、网易等),频道管理集成之数据库存储...
Android资讯新闻类App(头条.网易等),频道管理集成之数据库存储 发布时间:2019-01-16 19:55, 浏览次数:305 , 标签: Android App * 经常看新闻类的大家都知 ...
- Android资讯新闻类App(头条、网易等),频道管理集成之数据库存储
经常看新闻类的大家都知道这个频道管理. 图片转载https://blog.csdn.net/u011916937/article/details/50483278 我这里是用的Github,开源项目, ...
- Android 频道管理仿今日头条
导入依赖 在项目的build.gradle导入 allprojects {repositories {jcenter() //下面这一行就是 maven { url "https://jit ...
- Android 频道管理,可拖动item排列,删除,添加
样式效果 1.创建自定义GridView /*** 作者:created by meixi* 邮箱:15913707499@163.com* 日期:2019/5/31 13*/pu ...
- Android 仿今日头条、网易新闻的频道管理
最近做新闻类型的项目,用到了频道管理,点击删除排序,拖动排序.来分享一下 下面上代码: MainActivity 布局 <?xml version="1.0" encodin ...
- Android 仿今日头条频道管理(下)(GridView之间Item的移动和拖拽)
前言 上篇博客我们说到了今日头条频道管理的操作交互体验,我也介绍了2个GridView之间Item的相互移动.详情请參考:Android 仿今日头条频道管理(上)(GridView之间Item的移动和 ...
- Android仿头条频道管理
XML文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...
- 使用 draggrid 实现 仿今日头条频道管理(详细步骤)
Android 中 使用 draggrid 实现仿今日头条频道管理(详细步骤) 前言 最近开发的项目中有类似今日头条新闻的频道管理,用的是第三方的draggrid 所以试着尝试做了一下.代码如下 ...
- 新闻频道管理的炫酷实现
新闻频道管理的炫酷实现 自定义GridLayout控件,可以在新闻咨询类APP中的管理页面使用到,也可以应用在类别管理中,总之,可以帮助我们设计更加规范和炫酷的手机页面. 新闻类app是最常见的应用之 ...
最新文章
- 部署IPV6有什么好处?
- 里氏替换原则→类型转换
- 关于source insight 置顶窗口或者处于前台挡住窗口解决办法
- 【转】linux su和sudo命令的区别——百度知道
- 最佳适应算法模拟内存分配
- visual 对话框之间调用_两套S71200之间实现S7通讯的方法
- 基于aspectj实现AOP操作的两种方式——xml配置
- 我也来说说Dynamic
- mybatis-批量操作
- MyBatis配置:在控制台打印SQL语句
- java bean的反射类_JAVA中反射机制五(JavaBean的内省与BeanUtils库)
- 回答一个微信好友的创业问题
- 收藏 | 深度学习之Numpy基础入门教程!
- PAT乙级 1013 数素数
- 源代码安装httpd服务器
- 打开多网页用服务器系统好吗,如何在打开多个网页后,只需在一个网页上操作,其他网页都会同步操作?...
- 大数据之多数据源综合管理系统:数据源配置管理
- 【Download error:TOO MANY REQUESTS】【TypeError:excepted string or buffer】
- hdu 6184 Counting Stars
- Python:PDF文件处理(数据处理)
热门文章
- ubuntu16.04安装nginx,nignx-rtmp-mpdule,ffmeg,搭建rtmp服务器
- FPGA设计中BRAM(Block RAMs)资源的使用(综合为BRAM)
- c++ <algorithm> swap 函数 reverse 函数 remove 函数
- 移动端h5落地页总结(vue cli+vant)
- 针尖上带着脚镣跳舞的widget
- 用html和css做动态动物,分享9款用HTML5/CSS3制作的动物、人物动画
- Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines 论文研读
- 苹果4K调色非编系统的一些事儿
- 码率多少算是正常的1080p_4K时代的1080P优派THD825家庭影院投影机值得买吗?
- Twitter Snowflake 主键生成