美文网首页
在Github做的那些微小的工作(3)

在Github做的那些微小的工作(3)

作者: 小呀么小黄鸡 | 来源:发表于2017-04-24 17:28 被阅读29次

    MyItemTouchHelperDemo

    原项目地址

    原项目

    项目总结:

    要做到item可移动:

    1. 在activity中向adapter传入ItemTouchHelper,其中ItemDragHelperCallback是作者YoKeyword写的,继承自ItemTouchHelper.Callback回调
    ItemDragHelperCallback callback = new ItemDragHelperCallback();
    final ItemTouchHelper helper = new ItemTouchHelper(callback);
    helper.attachToRecyclerView(mRecy);
    
    1. adapter实现接口OnItemMoveListener
    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        ChannelEntity item = list.get(fromPosition);
        list.remove(fromPosition);
        list.add(toPosition, item);
        notifyItemMoved(fromPosition, toPosition);
    }
    
    1. viewHolder实现接口OnDragVHListener
    @Override
    public void onItemSelected() {
        itemView.setBackgroundResource(R.drawable.bg_channel_p);
    }
    @Override
    public void onItemFinish() {
        itemView.setBackgroundResource(R.drawable.bg_channel);
    }
    

    ZhiHuViewPagerDemo

    很早以前就对知乎的详情页比较感兴趣,因为平常接触的ViewPager+fragments都是固定数量的。而这种ViewPager可以像pullLoadMoreList一样加载更多,唯一让人担心的是内存的oom问题,可能连知乎都不一定处理得很好,这次忽然想制作这样一个demo是因为一款设计新奇的应用VARY,感兴趣的可以看看这篇文章。

    其实实现起来也不是很困难:
    ps.所有的位置都是从0开始算的。

    参数名 参数含义
    fragments fragment的列表
    mViewPager ViewPager控件
    lastTabIndex 上一个tab的index
    nextTabIndex 当前tab的index
    pageSize 每一组数据的数量
    startLoadBefore 可以设置在数据末尾前多少个位置开始获取下批数据
    postDelay 获取数据的延迟,防止卡顿
    maxPage 最大页数
    maxPagePos 最大页数的位置
    initPos 初始位置
    nowMaxPos 当前的最大页数位置开始时为pageSize
    //位置初始化
    if (initPos < pageSize - 1) {
        nowMaxPos = maxPage < pageSize ? maxPagePos : pageSize - 1;
    } else if (initPos >= pageSize - 1) {//如果初始化位置比规定的每页页数还要大 则初始化的数据包含之前的所有数据
        nowMaxPos = initPos + pageSize - initPos % pageSize - 1;//最大页数位置
        //如果初始位置initPos等于当前最大页数位置nowMaxPos且加上pageSize小于maxPage-1则nowMaxPos多取一页
        //如果初始位置initPos等于当前最大页数位置nowMaxPos但是大于等于maxPage-1则nowMaxPos取最大页数的位置maxPage-1
        if (initPos == nowMaxPos && initPos + pageSize < maxPagePos) nowMaxPos += pageSize;
        else if (initPos == nowMaxPos) nowMaxPos = maxPagePos;
    }
    
    //获取数据时的判断 在mViewPager.addOnPageChangeListener中的onPageSelected
    if (position == nowMaxPos - startLoadBefore && nowMaxPos < maxPagePos) {
        getNextData();
    }
    
    public void getNextData() {
        //正常这里需要开新线程
        mViewPager.postDelayed(new Runnable() {
            @Override
            public void run() {
                final int start = nowMaxPos;
                if (nowMaxPos + pageSize <= maxPagePos)
                    nowMaxPos += pageSize;
                else
                    nowMaxPos = maxPagePos;
                Log.e(TAG, "start to add " + start + "-" + nowMaxPos);
                Log.e(TAG, "nowMaxPage" + nowMaxPos);
                for (int i = start + 1; i < nowMaxPos + 1; i++) {
                    //数据模拟
                    list.add(i, new VaryModel(id, zan, comment, page, "detail" + id, id % 2 == 0 ? url1 : url2));
    
                    Message msg = Message.obtain();
                    Bundle bundle = new Bundle();
                    bundle.putSerializable(EXTRA_MODEL, list.get(i));//传id用它获取详情
                    msg.what = 0;
                    msg.arg1 = i;
                    msg.obj = bundle;
                    handler.sendMessage(msg);
                    if (i == nowMaxPos) {
                        Message msg1 = Message.obtain();
                        msg1.what = 1;
                        handler.sendMessage(msg1);
                    }
                }
            }
        }, postDelay);
    }
    
    //handler的逻辑
    protected boolean initCallback(Message msg) {
        switch (msg.what) {
            case 0:
                Bundle b = (Bundle) msg.obj;
                fragments.add(msg.arg1, VaryTestFragment.getInstance(b));
                break;
            case 1:
                adapter.notifyDataSetChanged();
                break;
        }
        return false;
    }
    

    本系列其他文章:
    在Github做的那些微小的工作(序)
    在Github做的那些微小的工作(1)
    在Github做的那些微小的工作(2)

    相关文章

      网友评论

          本文标题:在Github做的那些微小的工作(3)

          本文链接:https://www.haomeiwen.com/subject/adylzttx.html