UltimateRecyclerView的用法具体解释
近期在用非常多第三方库的时候,发现有一些附带的demo写的不是非常全面或者样例的代码太多,凝视太少,要想使用还要去看下源代码什么的(。。
。用第三方开源库不就是想节省时间嘛)。所以决定每周两到三篇。写一些比較热门的库的用法。让使用的人能高速上手(对我而言,要是发现库提供的功能有时不满足需求。可能会扩展下功能什么的)。不废话,以后都是直接贴代码。代码中写满凝视,这样看起来的时候方便,我也省事。
(嫌麻烦的直接下拉到第5)
效果图
1.这是使用到的布局文件。非常easy。看成时仅仅有一个UltimateRecyclerView即可 activity_recycler_view.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="github.dzc.apptemplate.recyclerview.RecyclerViewActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/action_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" >
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="RecyclerViewActivity"
android:gravity="center"
android:textColor="@android:color/white"/>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<com.marshalchen.ultimaterecyclerview.UltimateRecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/action_bar"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="github.dzc.apptemplate.recyclerview.RecyclerViewActivity"
></com.marshalchen.ultimaterecyclerview.UltimateRecyclerView>
</RelativeLayout>
2.头部布局 仅仅有一张图片 head_view.xml
<?
xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/img"
android:scaleType="centerCrop">
</ImageView>
3.item的布局 string_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp">
</TextView>
4.ViewHolder
package github.dzc.apptemplate.recyclerview.viewholder;
import android.view.View;
import android.widget.TextView;
import com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder;
/**
* Created by dzc on 16/1/22.
*/
public class StringViewHolder extends UltimateRecyclerviewViewHolder{
public TextView tv;
public StringViewHolder(View itemView,boolean isItem) {
super(itemView);
if(isItem){
tv = (TextView) itemView;
}
}
}
5.重点来了。全部凝视都在这里
package github.dzc.apptemplate.recyclerview;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SimpleAdapter;
import com.marshalchen.ultimaterecyclerview.UltimateRecyclerView;
import com.marshalchen.ultimaterecyclerview.UltimateViewAdapter;
import com.marshalchen.ultimaterecyclerview.itemTouchHelper.SimpleItemTouchHelperCallback;
import com.marshalchen.ultimaterecyclerview.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import github.dzc.apptemplate.BaseActivity;
import github.dzc.apptemplate.R;
import github.dzc.apptemplate.recyclerview.viewholder.StringViewHolder;
public class RecyclerViewActivity extends BaseActivity {
@Bind(R.id.recycler_view)
UltimateRecyclerView recyclerView;
View headerView;
private StringAdapter adapter;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
ButterKnife.bind(this);
handler = new Handler();
recyclerView.setLayoutManager(new LinearLayoutManager(this));
headerView = LayoutInflater.from(this).inflate(R.layout.head_view,null);
adapter = new StringAdapter(data);
recyclerView.setAdapter(adapter);
//为每一个item加入头部的布局 这里运用到的事实上就是RecyclerView.ItemDecoration
//没错 可能一般都是用这个来实现item之间的分隔线的 可是线也是一个view,但这个view够大的时候,就是一个头部了
StickyRecyclerHeadersDecoration stickyRecyclerHeadersDecoration = new StickyRecyclerHeadersDecoration(adapter);
recyclerView.addItemDecoration(stickyRecyclerHeadersDecoration);
ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter){
//这种方法还有别的方法能够重载 能够控制如滑动删除等功能
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//控制拖动的方向 这里设置了智能上下拖动交换位置
final int swipeFlags = ItemTouchHelper.LEFT ;//控制滑动删除的方向 这里设置了仅仅能左滑删除
// final int swipeFlags = ItemTouchHelper.LEFT |ItemTouchHelper.RIGHT;//左右滑删除
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean isItemViewSwipeEnabled() {
return super.isItemViewSwipeEnabled();//这里控制开启或关闭item能否够滑动删除的功能
}
@Override
public boolean isLongPressDragEnabled() {
return super.isLongPressDragEnabled();//控制长按拖动功能
}
};
final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(recyclerView.mRecyclerView);
//设置头部一定要在setAdapter后面,由于这个操作会调用adapter的方法来显示头部,假设adapter为null,则出错
recyclerView.setParallaxHeader(headerView);
recyclerView.enableDefaultSwipeRefresh(true);//开启下拉刷新
recyclerView.enableLoadmore();//开启上拉载入很多其它
recyclerView.setDefaultOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
recyclerView.setRefreshing(false);
}
},2000);
}
});
}
class StringAdapter extends UltimateViewAdapter<StringViewHolder>{
private List<String> stringList;
public StringAdapter(List<String> stringList) {
this.stringList = stringList;
}
@Override
public StringViewHolder getViewHolder(View view) {
return new StringViewHolder(view,false);
//这个getViewHolder方法在内部实现中仅仅有在获取头部、载入很多其它、下拉刷新的时候会调用
//直接设置itemView为GONE,所以不须要初始化什么的。仅仅要返回的是个ViewHolder即可
}
@Override
public StringViewHolder onCreateViewHolder(ViewGroup parent) {
View view = LayoutInflater.from(RecyclerViewActivity.this).inflate(R.layout.string_item,null);
return new StringViewHolder(view,true);
}
@Override
public int getAdapterItemCount() {
return stringList==null?0:stringList.size();
//这里返回的是你的item的个数 不包含头部和载入view
}
@Override
public long generateHeaderId(int position) {
// if (getItem(position).length() > 0)
// return getItem(position).charAt(0);
// else return -1;
if(customHeaderView!=null){
position-=1;
}
String s = position+"";
return s.charAt(0);
//为每一项item生成头部的View。假设返回-1。则不生成,假如多个连续的item返回同一个id,
//则仅仅会生成一个头部View
//这里提取position的第一个数作为id
//1 10 11 12 14等返回的id是一样的 为1
}
@Override
public void onBindViewHolder(StringViewHolder holder, int position) {
//一定要加这个推断 由于UltimateRecyclerView本身有加了头部和尾部 这种方法返回的是包含头部和尾部在内的
if (position < getItemCount() && (customHeaderView != null ? position <= stringList.size() : position < stringList.size()) && (customHeaderView != null ? position > 0 : true)) {
position -= customHeaderView==null?0:1;
holder.tv.setText(stringList.get(position));
}
}
@Override
public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup parent) {
View view = LayoutInflater.from(RecyclerViewActivity.this).inflate(R.layout.string_item,null);
return new StringViewHolder(view,true);
//初始化item的头部布局 这里为了方便 就直接用StringViewHolder,实际使用能够使用不同于item的布局
}
@Override
public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, int position) {
if(customHeaderView!=null){
position-=1;
}
((StringViewHolder)holder).tv.setText("header "+(position+"").charAt(0));
((StringViewHolder)holder).tv.setTextColor(getResources().getColor(android.R.color.holo_red_dark));
//绑定item头部view的数据,这里提取每一个view的position的第一个数来作为头部显示数据
//即10 11 12 13 14这些 返回的是1
//20 21 22等是2
}
@Override
public void onItemMove(int fromPosition, int toPosition) {
swapPositions(data,fromPosition,toPosition);
//假设开启的拖动移动位置的功能
//要重写这种方法 由于假设不重写 交换的仅仅是view的位置,数据的位置没有交换 一拖动。就会变成原来的样子
super.onItemMove(fromPosition, toPosition);
}
@Override
public void onItemDismiss(int position) {
remove(data,position);//控制删除的
super.onItemDismiss(position);
}
}
}
代码我放在了github
https://github.com/duzechao/AppTemplate
UltimateRecyclerView的用法具体解释的更多相关文章
- 31 Python中 sys.argv[]的用法简明解释(转)
Python中 sys.argv[]的用法简明解释 因为是看书自学的python,开始后不久就遇到了这个引入的模块函数,且一直在IDLE上编辑了后运行,试图从结果发现它的用途,然而结果一直都是没结果, ...
- Python中 sys.argv的用法简明解释
Python中 sys.argv[]的用法简明解释 sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键,所以那些试图从代码来说明它作用的解释一直没看明白.因为我们从外部取得 ...
- H5 新标签用法及解释
HTML 5 是一个新的网络标准,目标在于取代现有的 HTML 4.01, XHTML 1.0 and DOM Level 2 HTML 标准.它希望能够减少浏览器对于需要插件的丰富性网络应用服务(p ...
- sed详解---用法及解释
1.sed -n '2'p filename 打印文件的第二行. 2.sed -n '1,3'p filename 打印文件的1到3行 3. sed -n '/Neave/'p filename 打印 ...
- destoon系统中get_maincat的用法及解释
get_maincat函数的用法, 如get_maincat(0, $mid, 1),其中第一.二.三个参数分别表示什么? 第一个参数代表parentid 第二个参数代表所有的分类 第三个参数 代表 ...
- Python中 sys.argv[]的用法简明解释
sys.argv[]就是一个从程序外部获取参数的桥梁,这个“外部”很关键.因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能 ...
- rsync用法详细解释
提要 熟悉 rsync 的功能及其特点 掌握 rsync 语法及常用选项的功能 掌握 rsync 命令的三种基本使用方法 掌握如何筛选 rsync 的传输目标 掌握使用 rsync 进行镜像和增量备份 ...
- tableView的用法具体解释
1 tableView的类型 1.1 UITableViewStylePlain 没有区头 不显区头 向上滑动区头不会移动到屏幕外面 ' 1.2 UITableViewStyleGrou ...
- python sys.argv[]的用法简明解释
sys模块中文参考文档:http://xukaizijian.blog.163.com/blog/static/170433119201111625428624/ sys.argv[]: 「argv」 ...
随机推荐
- Android默认输入法语言的修改以及SettingsProvider作用
Android源码中默认的有三种输入法:英文,中文,日文.对应的工程代码路径为:<android_root>/packages/inputmethods/LatinIME/<andr ...
- inux下rz、sz的简单安装
工具/原料 在xshell或者SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz/sz命令来上传/下载文件. 对于RHEL5, rz/sz默认没有安装所以需要手工安装. sz: ...
- 5whys分析法在美团工程师中的实践
转载美团博客:https://tech.meituan.com/5whys-method.html 前言 网站的质量和稳定性对于用户和公司来说至关重要,但是在网站的快速发展过程中,由于各种原因导致事故 ...
- Vue列表渲染,改变数据视图层监测不到的问题
由于 JavaScript 的限制, Vue 不能检测以下变动的数组: 当你利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue 当你修改数组的长度时,例 ...
- polyfill for Function--源码
/** * polyfill for Function */ // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer ...
- 共享内存之——system V共享内存
System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...
- Codeforces Gym101606 D.Deranging Hat (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))
D Deranging Hat 这个题简直了,本来想的是冒泡排序然后逆着输出来的,后来发现不对,因为题目上求的是最优解,而且冒泡的话,输出结果有的超出10000行了,所以就是把一开始的,排好序的字母标 ...
- luogu P1197 [JSOI2008]星球大战
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道 ...
- [Bzoj5359][Lydsy1805月赛]寻宝游戏(dp)
5359: [Lydsy1805月赛]寻宝游戏 Time Limit: 2 Sec Memory Limit: 512 MBSubmit: 71 Solved: 19[Submit][Status ...
- 2008 SQL SERVER 用户 架构
2008 SQL SERVER 用户: SERVER用户与数据库用户 SERVER 与 数据库用户的映射,以使 登陆用户可访问数据库 架构等同于SCHEM (表空间),即表空间管理对象,建立层次对象关 ...