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

MyItemTouchHelperDemo

原项目地址

在Github做的那些微小的工作(3)_第1张图片
原项目

项目总结:

要做到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))