Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
android
/
dayu
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
25a593b2
authored
Dec 09, 2017
by
罗翻
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
recyclerview封装
parent
2069dc7e
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
404 additions
and
0 deletions
app/src/main/java/com/dayu/bigfish/base/adapter/BaseViewHolder.java
app/src/main/java/com/dayu/bigfish/base/adapter/CoreAdapter.java
app/src/main/java/com/dayu/bigfish/base/adapter/LRecyclerView.java
app/src/main/java/com/dayu/bigfish/base/adapter/TypeSelector.java
app/src/main/java/com/dayu/bigfish/base/adapter/BaseViewHolder.java
0 → 100755
View file @
25a593b2
package
com
.
dayu
.
bigfish
.
base
.
adapter
;
import
android.databinding.ViewDataBinding
;
import
android.support.v7.widget.RecyclerView
;
/**
* Created by luofan on 2017/12/9.
*/
public
class
BaseViewHolder
<
T
extends
ViewDataBinding
>
extends
RecyclerView
.
ViewHolder
{
public
final
T
mBind
;
public
BaseViewHolder
(
T
t
)
{
super
(
t
.
getRoot
());
mBind
=
t
;
}
}
app/src/main/java/com/dayu/bigfish/base/adapter/CoreAdapter.java
0 → 100755
View file @
25a593b2
package
com
.
dayu
.
bigfish
.
base
.
adapter
;
import
android.content.Context
;
import
android.databinding.DataBindingUtil
;
import
android.support.annotation.LayoutRes
;
import
android.support.v7.widget.RecyclerView
;
import
android.view.LayoutInflater
;
import
android.view.ViewGroup
;
import
com.dayu.bigfish.BR
;
import
com.dayu.bigfish.Constants
;
import
com.dayu.bigfish.R
;
import
com.dayu.bigfish.base.BasePageBean
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* Created by luofan on 2017/12/9.
*/
@SuppressWarnings
(
"unchecked"
)
public
class
CoreAdapter
<
M
>
extends
RecyclerView
.
Adapter
<
BaseViewHolder
>
{
private
boolean
needHint
=
false
;
private
TypeSelector
<
M
>
mTypeSelector
;
private
List
<
M
>
mItemList
=
new
ArrayList
<>();
public
boolean
isHasMore
=
true
;
private
List
<
Item
>
mHeadTypeDatas
=
new
ArrayList
<>();
private
List
<
Item
>
mFootTypeDatas
=
new
ArrayList
<>();
private
int
viewType
;
private
int
mFooterViewType
=
R
.
layout
.
recycler_foot
;
protected
Context
mContext
;
private
int
mTotalPage
;
private
int
mPage
=
1
;
public
boolean
isLoadFial
=
false
;
@Override
public
BaseViewHolder
onCreateViewHolder
(
ViewGroup
parent
,
int
viewType
)
{
this
.
mContext
=
parent
.
getContext
();
return
new
BaseViewHolder
(
DataBindingUtil
.
inflate
(
LayoutInflater
.
from
(
parent
.
getContext
()),
viewType
,
parent
,
false
));
}
public
CoreAdapter
()
{
mFootTypeDatas
.
add
(
new
Item
(
mFooterViewType
,
true
));
}
@Override
public
void
onBindViewHolder
(
BaseViewHolder
holder
,
int
position
)
{
Object
item
=
getItem
(
position
);
if
(
needHint
&&
holder
.
itemView
.
getTag
()
==
null
)
{
holder
.
itemView
.
setTag
(
item
);
holder
.
itemView
.
postDelayed
(()
->
{
holder
.
mBind
.
setVariable
(
BR
.
item
,
holder
.
itemView
.
getTag
());
holder
.
mBind
.
executePendingBindings
();
if
(!(
item
instanceof
Boolean
))
{
onBind
(
holder
,
position
,
(
M
)
item
);
}
},
100
);
}
else
{
if
(
needHint
)
{
holder
.
itemView
.
setTag
(
item
);
}
holder
.
mBind
.
setVariable
(
BR
.
item
,
item
);
holder
.
mBind
.
executePendingBindings
();
if
(
item
!=
null
&&
!(
item
instanceof
Boolean
))
{
onBind
(
holder
,
position
,
(
M
)
item
);
}
}
}
public
void
setViewType
(
@LayoutRes
int
type
)
{
this
.
viewType
=
type
;
}
public
void
setTypeSelector
(
TypeSelector
mTypeSelector
)
{
this
.
mTypeSelector
=
mTypeSelector
;
this
.
viewType
=
Constants
.
FLAG_MULTI_VH
;
}
public
void
addHeadViewType
(
@LayoutRes
int
i
,
Object
data
)
{
mHeadTypeDatas
.
add
(
new
Item
(
i
,
data
));
}
public
void
addFooterViewType
(
@LayoutRes
int
i
,
Object
data
)
{
mFootTypeDatas
.
add
(
mFootTypeDatas
.
size
()
-
1
,
new
Item
(
i
,
data
));
}
public
Object
getItem
(
int
position
)
{
if
(
position
<
mHeadTypeDatas
.
size
())
{
return
mHeadTypeDatas
.
get
(
position
).
data
;
}
else
if
(
position
>=
(
mHeadTypeDatas
.
size
()
+
mItemList
.
size
()))
{
int
index
=
position
-
(
mHeadTypeDatas
.
size
()
+
mItemList
.
size
());
if
(
mFootTypeDatas
.
get
(
index
).
type
==
mFooterViewType
&&
!
isHasMore
)
{
if
(
isLoadFial
)
{
return
null
;
}
else
{
return
false
;
}
}
else
{
if
(
isLoadFial
)
{
return
null
;
}
else
{
return
mFootTypeDatas
.
get
(
index
).
data
;
}
}
}
else
{
return
mItemList
.
get
(
position
-
mHeadTypeDatas
.
size
());
}
}
@Override
public
int
getItemViewType
(
int
position
)
{
if
(
position
<
mHeadTypeDatas
.
size
())
{
return
mHeadTypeDatas
.
get
(
position
).
type
;
}
else
if
(
position
>=
(
mHeadTypeDatas
.
size
()
+
mItemList
.
size
()))
{
return
mFootTypeDatas
.
get
(
position
-
(
mHeadTypeDatas
.
size
()
+
mItemList
.
size
())).
type
;
}
else
{
return
viewType
==
Constants
.
FLAG_MULTI_VH
?
mTypeSelector
.
getType
((
M
)
getItem
(
position
))
:
viewType
;
}
}
public
void
addData
(
BasePageBean
<
M
>
data
)
{
if
(
data
==
null
)
{
isHasMore
=
false
;
notifyDataSetChanged
();
return
;
}
mPage
+=
1
;
mTotalPage
=
data
.
getTotalPages
();
if
(
mPage
>=
mTotalPage
)
{
isHasMore
=
false
;
}
else
{
isHasMore
=
true
;
}
this
.
mItemList
.
addAll
(
data
.
getData
());
notifyDataSetChanged
();
}
public
void
setNewData
(
BasePageBean
<
M
>
data
)
{
mPage
=
1
;
mTotalPage
=
data
.
getTotalPages
();
if
(
mPage
>=
mTotalPage
)
{
isHasMore
=
false
;
}
else
{
isHasMore
=
true
;
}
this
.
mItemList
=
data
.
getData
();
notifyDataSetChanged
();
}
@Override
public
int
getItemCount
()
{
return
mItemList
.
size
()
+
mHeadTypeDatas
.
size
()
+
mFootTypeDatas
.
size
();
}
public
class
Item
{
int
type
;
Object
data
;
public
Item
(
int
type
,
Object
data
)
{
this
.
type
=
type
;
this
.
data
=
data
;
}
}
protected
void
onBind
(
BaseViewHolder
holder
,
int
position
,
M
item
)
{
}
}
\ No newline at end of file
app/src/main/java/com/dayu/bigfish/base/adapter/LRecyclerView.java
0 → 100644
View file @
25a593b2
package
com
.
dayu
.
bigfish
.
base
.
adapter
;
import
android.content.Context
;
import
android.content.res.TypedArray
;
import
android.support.annotation.LayoutRes
;
import
android.support.annotation.NonNull
;
import
android.support.annotation.Nullable
;
import
android.support.v4.widget.SwipeRefreshLayout
;
import
android.support.v7.widget.DefaultItemAnimator
;
import
android.support.v7.widget.LinearLayoutManager
;
import
android.support.v7.widget.RecyclerView
;
import
android.util.AttributeSet
;
import
android.view.View
;
import
android.widget.FrameLayout
;
import
android.widget.LinearLayout
;
import
com.dayu.bigfish.R
;
import
com.dayu.bigfish.base.BasePageBean
;
import
com.dayu.bigfish.ui.listener.OnRefreshListener
;
import
com.dayu.bigfish.ui.listener.onLoadMoreListener
;
/**
* Created by luofan on 2017/12/9.
*/
public
class
LRecyclerView
<
M
>
extends
FrameLayout
{
private
boolean
isHasHeadView
=
false
,
isHasFootView
=
false
,
isEmpty
=
false
,
isReverse
=
false
,
needHint
=
false
,
needCoreAdapter
=
false
;
private
int
headType
,
footType
;
private
SwipeRefreshLayout
swipeRefresh
;
private
RecyclerView
recyclerview
;
private
LinearLayout
ll_emptyView
;
private
OnRefreshListener
mRefreshListener
;
private
onLoadMoreListener
mLoadMoreListener
;
private
LinearLayoutManager
mLayoutManager
;
public
CoreAdapter
<
M
>
mCommAdapter
;
private
int
itemType
;
private
boolean
isRefresh
=
true
;
public
LRecyclerView
(
@NonNull
Context
context
)
{
super
(
context
);
init
(
context
,
null
);
}
public
LRecyclerView
(
@NonNull
Context
context
,
@Nullable
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
init
(
context
,
attrs
);
}
public
LRecyclerView
(
@NonNull
Context
context
,
@Nullable
AttributeSet
attrs
,
int
defStyleAttr
)
{
super
(
context
,
attrs
,
defStyleAttr
);
init
(
context
,
attrs
);
}
private
void
init
(
Context
context
,
AttributeSet
attrs
)
{
//初始化参数
TypedArray
ta
=
getContext
().
obtainStyledAttributes
(
attrs
,
R
.
styleable
.
TRecyclerView
);
headType
=
ta
.
getResourceId
(
R
.
styleable
.
TRecyclerView_headType
,
0
);
itemType
=
ta
.
getResourceId
(
R
.
styleable
.
TRecyclerView_itemType
,
0
);
footType
=
ta
.
getResourceId
(
R
.
styleable
.
TRecyclerView_footType
,
0
);
isReverse
=
ta
.
getBoolean
(
R
.
styleable
.
TRecyclerView_isReverse
,
false
);
needCoreAdapter
=
ta
.
getBoolean
(
R
.
styleable
.
TRecyclerView_needCoreAdapter
,
false
);
if
(!
needHint
)
needHint
=
ta
.
getBoolean
(
R
.
styleable
.
TRecyclerView_needHint
,
false
);
boolean
isRefreshable
=
ta
.
getBoolean
(
R
.
styleable
.
TRecyclerView_isRefreshable
,
true
);
ta
.
recycle
();
//初始化recycleview
View
layout
=
inflate
(
context
,
R
.
layout
.
layout_list_recyclerview
,
this
);
swipeRefresh
=
(
SwipeRefreshLayout
)
layout
.
findViewById
(
R
.
id
.
swiperefresh
);
recyclerview
=
(
RecyclerView
)
layout
.
findViewById
(
R
.
id
.
recyclerview
);
ll_emptyView
=
(
LinearLayout
)
layout
.
findViewById
(
R
.
id
.
ll_emptyview
);
swipeRefresh
.
setColorSchemeResources
(
android
.
R
.
color
.
holo_blue_bright
);
mLayoutManager
=
new
LinearLayoutManager
(
context
);
recyclerview
.
setLayoutManager
(
mLayoutManager
);
recyclerview
.
setItemAnimator
(
new
DefaultItemAnimator
());
swipeRefresh
.
setEnabled
(
isRefreshable
);
if
(
needCoreAdapter
)
{
if
(
itemType
!=
0
)
{
mCommAdapter
=
new
CoreAdapter
<>();
setViewType
(
itemType
);
recyclerview
.
setAdapter
(
mCommAdapter
);
}
}
if
(
isReverse
)
{
mLayoutManager
.
setStackFromEnd
(
true
);
//列表再底部开始展示,反转后由上面开始展示
mLayoutManager
.
setReverseLayout
(
true
);
//列表翻转
recyclerview
.
setLayoutManager
(
mLayoutManager
);
}
swipeRefresh
.
setOnRefreshListener
(()
->
{
Refresh
();
});
ll_emptyView
.
setOnClickListener
((
view
->
{
isEmpty
=
false
;
ll_emptyView
.
setVisibility
(
View
.
GONE
);
swipeRefresh
.
setVisibility
(
View
.
VISIBLE
);
Refresh
();
}));
recyclerview
.
addOnScrollListener
(
new
RecyclerView
.
OnScrollListener
()
{
int
lastVisibleItem
;
@Override
public
void
onScrollStateChanged
(
RecyclerView
recyclerView
,
int
newState
)
{
super
.
onScrollStateChanged
(
recyclerView
,
newState
);
if
(
recyclerview
.
getAdapter
()
!=
null
&&
newState
==
RecyclerView
.
SCROLL_STATE_IDLE
&&
lastVisibleItem
+
1
==
recyclerview
.
getAdapter
().
getItemCount
()
&&
mCommAdapter
.
isHasMore
)
{
if
(
mLoadMoreListener
!=
null
)
{
mCommAdapter
.
isLoadFial
=
false
;
mCommAdapter
.
notifyDataSetChanged
();
isRefresh
=
false
;
mLoadMoreListener
.
onLoadMore
();
}
}
}
@Override
public
void
onScrolled
(
RecyclerView
recyclerView
,
int
arg0
,
int
arg1
)
{
super
.
onScrolled
(
recyclerView
,
arg0
,
arg1
);
lastVisibleItem
=
mLayoutManager
.
findLastVisibleItemPosition
();
}
});
}
public
void
setAdapter
(
CoreAdapter
<
M
>
adapter
)
{
mCommAdapter
=
adapter
;
if
(
itemType
!=
0
)
{
setViewType
(
itemType
);
}
recyclerview
.
setAdapter
(
mCommAdapter
);
}
public
LRecyclerView
setFootData
(
Object
data
)
{
isHasFootView
=
footType
!=
0
;
this
.
mCommAdapter
.
addFooterViewType
(
footType
,
data
);
return
this
;
}
public
LRecyclerView
setHeadData
(
Object
data
)
{
isHasHeadView
=
headType
!=
0
;
this
.
mCommAdapter
.
addHeadViewType
(
headType
,
data
);
return
this
;
}
public
void
setEmpty
()
{
if
((!
isHasHeadView
||
isReverse
&&
!
isHasFootView
)
&&
!
isEmpty
)
{
isEmpty
=
true
;
ll_emptyView
.
setVisibility
(
View
.
VISIBLE
);
swipeRefresh
.
setVisibility
(
View
.
GONE
);
}
}
public
void
reSetEmpty
()
{
if
(
isEmpty
)
{
ll_emptyView
.
setVisibility
(
View
.
GONE
);
swipeRefresh
.
setVisibility
(
View
.
VISIBLE
);
}
}
public
void
setNewData
(
BasePageBean
<
M
>
data
)
{
if
(
isRefresh
)
{
if
(
data
==
null
)
{
setEmpty
();
return
;
}
mCommAdapter
.
isLoadFial
=
false
;
reSetEmpty
();
swipeRefresh
.
setRefreshing
(
false
);
if
(
data
!=
null
&&
data
.
getData
().
size
()
==
0
)
{
setEmpty
();
}
else
if
(
isReverse
)
{
recyclerview
.
scrollToPosition
(
mCommAdapter
.
getItemCount
()
-
data
.
getData
().
size
()
-
2
);
}
mCommAdapter
.
setNewData
(
data
);
}
else
{
mCommAdapter
.
isLoadFial
=
false
;
swipeRefresh
.
setRefreshing
(
false
);
mCommAdapter
.
addData
(
data
);
}
}
public
void
setDataFail
()
{
if
(
isRefresh
)
{
setEmpty
();
}
else
{
mCommAdapter
.
isLoadFial
=
true
;
mCommAdapter
.
notifyDataSetChanged
();
}
}
public
void
Refresh
()
{
if
(
mRefreshListener
!=
null
)
{
isRefresh
=
true
;
mRefreshListener
.
refresh
();
}
}
public
void
setViewType
(
@LayoutRes
int
type
)
{
mCommAdapter
.
setViewType
(
type
);
}
public
void
setRefreshListener
(
OnRefreshListener
listener
)
{
mRefreshListener
=
listener
;
}
public
void
setOnLoadMoreListener
(
onLoadMoreListener
listener
)
{
mLoadMoreListener
=
listener
;
}
}
app/src/main/java/com/dayu/bigfish/base/adapter/TypeSelector.java
0 → 100755
View file @
25a593b2
package
com
.
dayu
.
bigfish
.
base
.
adapter
;
/**
* Created by luofan on 2017/12/9.
*/
public
interface
TypeSelector
<
M
>
{
int
getType
(
M
m
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment