UltimateRecyclerView的用法具体解释
Posted liguangsunls
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的用法具体解释的主要内容,如果未能解决你的问题,请参考以下文章