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」 ...
随机推荐
- [NOIP2009] $Hankson$ 的趣味题 (数论,gcd)
题目链接 Solution 此题,用到的结论都是比较浅显的,但是,我竟然没想到反过来枚举... 只有50分... 被自己蠢哭... 结论比较浅显: 1.对于两个正整数\(a\),\(b\),设 \(g ...
- P4551 最长异或路径 (01字典树,异或前缀和)
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式: 第一行一 ...
- JS判断SharePoint页面编辑状态
这篇博客主要讲使用不同的客户端方式来判断页面的编辑模式. 1.当页面处于发布状态时,可以使用下面两种方式:if(g_disableCheckoutInEditMode == true) { ale ...
- Codevs 1501 二叉树的最大宽度和高度
1501 二叉树最大宽度和高度 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 给出一个二叉树,输出它的最大宽度和高度. 输入描 ...
- CSS 盒模型、解决方案、BFC 原理讲解--摘抄
PS:内容比较基础,目的只是覆盖面试知识点,大佬可以 history.back(-1) W3C 标准盒模型 & IE 怪异盒模型 页面上显示的每个元素(包括内联元素)都可以看作一个盒子,即盒模 ...
- 電池的標稱電壓 與 power consumption 量測
電池標稱電壓 定義如下圖, 以25度為例,20度再往上點, 4V 放一下電就往下掉, 3V 放一下電就往下掉, 假設 3.8V 是擁有最多 capacity 可以 discharge 的電壓,放電放了 ...
- Android 4.4 不休眠+不锁屏+默认中文+去除导航栏
1.不休眠 frameworks/base/packages/SettingsProvider/res/values/defaults.xml 里面60000改成-1,就是不进入休眠. 这个文件还保存 ...
- SpringMVC (<context:include-filter>和<context:exclude-filter>的使用)
eg: 1.现在给定一个项目包的结构: com.yk.controller com.yk.service 2.在SpringMVC.XML有以下的配置: <!--扫描@controller注解- ...
- rostopic pub
rostopic pub -1 reinit_motor_wheel std_msgs/String -- "reinit_motor_wheel"rostopic pub -r ...
- 554 DT:SPM 163 smtp5,D9GowAD3RPYqSvxZjpMaAA--.4817S2 1509706293 坑爹的防垃圾邮件机制
代码如下 package ssmtest; import java.io.File;import java.io.UnsupportedEncodingException;import java.ut ...