近期在用非常多第三方库的时候,发现有一些附带的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. 给长标题加...css

    .wrap{ white-space:nowrap;overflow:hidden;text-overflow: ellipsis; } <th class="wrap"&g ...

  2. 如何发布自己的服务---zookeeper

    人肉告知的方式:如果你发现你的服务一台机器不够,要再添加一台,这个时候就要告诉调用者我现在有两个ip了,你们要轮询调用来实现负载均衡:调用者咬咬牙改了,结果某天一台机器挂了,调用者发现服务有一半不可用 ...

  3. es6总结(十一)--class & decorator

  4. Atcoder CODE FESTIVAL 2017 qual B E - Popping Balls 组合计数

    题目链接 题意 \(A+B\)个球排成一行,左边\(A\)个为红球,右边\(B\)个为蓝球. 最开始可以选择两个数\(s,t\),每次操作可以取左起第\(1\)或\(s\)或\(t\)个球.问有多少种 ...

  5. linux 时间模块 三

    LINUX的时钟中断中涉及至二个全局变量一个是xtime,另一个则是jiffies.有一个与时间有关的时钟:实时时钟(RTC),这是一个硬件时钟,用来持久存放系统时间,系统关闭后靠主板上的微型电池保持 ...

  6. 转载——Step by Step 创建一个 Web Service

    原创地址:http://www.cnblogs.com/jfzhu/p/4022139.html 转载请注明出处 (一)创建Web Service 创建第一个项目,类型选择ASP.NET Empty ...

  7. Ui大屏

    http://www.uimaker.com/plus/view.php?aid=128661&pageno=1

  8. Group by 两表联查取另一表与之关联数据的总数

    使用group by 需要查询的字段 必须要放在group by 后面 SELECT U.UserLotterySn,count(W.Userlotterysn) as WinCount,U.Acti ...

  9. android中添加只有border-left的样式

    如何在android中的边框添加只有左边边框有颜色的样式呢 1. 相应的drawable文件 <?xml version="1.0" encoding="utf-8 ...

  10. Jackson反序列化错误:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field的解决方法

    说明:出现这种问题的情况是由于JSON里面包含了实体没有的字段导致反序列化失败. 解决方法: // 第一种解决方案 // ObjectMapper对象添加 mapper.configure(Deser ...