APP内列表控件下载功能相关优化

204 阅读3分钟

概述

在AndroidApp开发过程中,我们经常会遇到在列表中点击按钮进行文件下载的操作。
由于之前项目中做的这块感觉有点缺陷。
所以我们想能不能有一种方式能够统一一下下载的回调。使其应用起来更加简单快捷。

本工程思路

封装下载库的listener,把自定义下载的listener封装进下载库的直接listener当中。
在我点击下载时根据KeyGe参数,把下载库listener插入到manager的map中。
listview的item滚出屏幕时,移除自定义的listener。当listVew复用convertView。
清理掉自定义的listener然后更新存到下载库listener中的自定义listener。
这样的话就可以利用相同的代码实现不同列表之间也可以进下载进度的调用

之前下载

  1. 循环判断
k的做法,根据下载回调中回调回来的bean循环判断当前列表中所有数据,检测到id相同,则更新数据
  1. 定时刷新
职上的做法,之前由于参考播放器播放中时间刷新,在启动页面时做一个定时器,每一秒更新播放进度。
职上是每一秒读取一次数据库,更新下载播放进度。列表中没有下载的,则停止定时器,停止更新。
现在看并不是好的方式。

直接应用下载框架的回调

我们在列表中的下载,假如直接把数据的回调应用到当前列表中,则会产生如下问题:

1. 在listview中item复用时,本来没有点击下载的item当之前点击过下载的item划出,被复用到新来的item中,
会出现没有下载却显示进度回调问题。
2. 在点击下载的地方可以拿到回调更新,而跳转到其他页面比如下载队列,界面无法更新的问题。

本工程要达到的目的

1. 当文件在A列表中下载,然后跳转到b列表,假如b列表中有相同的项目可以直接显示下载中的进度条等。
2. 利用把自定义listener添加进下载listener(还有删除,和更新等)的方式规避上面之前下载的问题。
3. 在使用此库时,可以把设置下载时对控件下载进度,下载状态已下大小等控件的设置单独抽取到一个类中完成。
分工更加明确。
4.支持一个app内多种下载库的统一。比如腾讯回放下载和GK下载。可以用此库把下载过程中的回调统一起来。 
5.未来要增加数据库支持,让列表中的不同类型下载执行不同的数据库操作。-->还未完成

工程结构图

使用方法

ListView中的使用

  1. ListView的Adapter中的ViewHolder需要实现BaseDownlViewHolder,以便从ViewHolder中获取KeyGen。例:
public class ViewHolder implements BaseDownlViewHolder {
        public Button name;
        public KeyGen keyGen;
        @Override
        public IKeyGen getKeyGen() {
            return keyGen;
        }
    }
  1. 创建KeyGen作为下面处理使用 见图中①
  2. 点击下载时,new新的Listener,并把自定义listener放入其中见图中③。
  3. getView方法中如果是被服用的convert,则清理掉之前的自定义listener见图中②。然后任何情况下都更新一下自定义的listener见图中③

基本流程图

Demo地址