近期在用非常多第三方库的时候,发现有一些附带的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的用法具体解释的更多相关文章

  1. 31 Python中 sys.argv[]的用法简明解释(转)

    Python中 sys.argv[]的用法简明解释 因为是看书自学的python,开始后不久就遇到了这个引入的模块函数,且一直在IDLE上编辑了后运行,试图从结果发现它的用途,然而结果一直都是没结果, ...

  2. Python中 sys.argv的用法简明解释

    Python中 sys.argv[]的用法简明解释 sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键,所以那些试图从代码来说明它作用的解释一直没看明白.因为我们从外部取得 ...

  3. H5 新标签用法及解释

    HTML 5 是一个新的网络标准,目标在于取代现有的 HTML 4.01, XHTML 1.0 and DOM Level 2 HTML 标准.它希望能够减少浏览器对于需要插件的丰富性网络应用服务(p ...

  4. sed详解---用法及解释

    1.sed -n '2'p filename 打印文件的第二行. 2.sed -n '1,3'p filename 打印文件的1到3行 3. sed -n '/Neave/'p filename 打印 ...

  5. destoon系统中get_maincat的用法及解释

    get_maincat函数的用法, 如get_maincat(0, $mid, 1),其中第一.二.三个参数分别表示什么? 第一个参数代表parentid 第二个参数代表所有的分类 第三个参数 代表 ...

  6. Python中 sys.argv[]的用法简明解释

    sys.argv[]就是一个从程序外部获取参数的桥梁,这个“外部”很关键.因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能 ...

  7. rsync用法详细解释

    提要 熟悉 rsync 的功能及其特点 掌握 rsync 语法及常用选项的功能 掌握 rsync 命令的三种基本使用方法 掌握如何筛选 rsync 的传输目标 掌握使用 rsync 进行镜像和增量备份 ...

  8. tableView的用法具体解释

    1 tableView的类型   1.1 UITableViewStylePlain  没有区头 不显区头     向上滑动区头不会移动到屏幕外面 ' 1.2 UITableViewStyleGrou ...

  9. python sys.argv[]的用法简明解释

    sys模块中文参考文档:http://xukaizijian.blog.163.com/blog/static/170433119201111625428624/ sys.argv[]: 「argv」 ...

随机推荐

  1. Android默认输入法语言的修改以及SettingsProvider作用

    Android源码中默认的有三种输入法:英文,中文,日文.对应的工程代码路径为:<android_root>/packages/inputmethods/LatinIME/<andr ...

  2. inux下rz、sz的简单安装

    工具/原料 在xshell或者SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz/sz命令来上传/下载文件. 对于RHEL5, rz/sz默认没有安装所以需要手工安装. sz: ...

  3. 5whys分析法在美团工程师中的实践

    转载美团博客:https://tech.meituan.com/5whys-method.html 前言 网站的质量和稳定性对于用户和公司来说至关重要,但是在网站的快速发展过程中,由于各种原因导致事故 ...

  4. Vue列表渲染,改变数据视图层监测不到的问题

    由于 JavaScript 的限制, Vue 不能检测以下变动的数组: 当你利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue 当你修改数组的长度时,例 ...

  5. polyfill for Function--源码

    /** * polyfill for Function */ // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer ...

  6. 共享内存之——system V共享内存

    System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...

  7. Codeforces Gym101606 D.Deranging Hat (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    D Deranging Hat 这个题简直了,本来想的是冒泡排序然后逆着输出来的,后来发现不对,因为题目上求的是最优解,而且冒泡的话,输出结果有的超出10000行了,所以就是把一开始的,排好序的字母标 ...

  8. luogu P1197 [JSOI2008]星球大战

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道 ...

  9. [Bzoj5359][Lydsy1805月赛]寻宝游戏(dp)

    5359: [Lydsy1805月赛]寻宝游戏 Time Limit: 2 Sec  Memory Limit: 512 MBSubmit: 71  Solved: 19[Submit][Status ...

  10. 2008 SQL SERVER 用户 架构

    2008 SQL SERVER 用户: SERVER用户与数据库用户 SERVER 与 数据库用户的映射,以使 登陆用户可访问数据库 架构等同于SCHEM (表空间),即表空间管理对象,建立层次对象关 ...