MyItemTouchHelperDemo
项目总结:
要做到item可移动:
- 在activity中向adapter传入ItemTouchHelper,其中ItemDragHelperCallback是作者YoKeyword写的,继承自
ItemTouchHelper.Callback
回调
ItemDragHelperCallback callback = new ItemDragHelperCallback();
final ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView(mRecy);
- 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);
}
- 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)