package
secondriver.sdk.activity;
import
android.app.Activity;
import
android.net.Uri;
import
android.os.Bundle;
import
android.support.v7.widget.DefaultItemAnimator;
import
android.support.v7.widget.RecyclerView;
import
android.support.v7.widget.StaggeredGridLayoutManager;
import
android.util.Log;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.TextView;
import
android.widget.Toast;
import
com.facebook.drawee.view.SimpleDraweeView;
import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.Random;
import
butterknife.Bind;
import
butterknife.ButterKnife;
import
secondriver.sdk.R;
/**
* Author : secondriver
* Created : 2015/11/18
*/
public
class
RecycleViewActivity
extends
Activity {
private
static
final
String TAG = RecyclerView.
class
.getName();
private
static
final
String[] RES_URL =
new
String[]{
"http://p1.wmpic.me/article/2015/11/16/1447644849_hySANEEF.jpg"
,
};
@Bind
(R.id.recycler_view)
public
RecyclerView mRecycleView;
private
final
int
PRE_SCREEN_NUMBER =
6
;
private
final
int
SPAN_COUNT =
2
;
private
int
previousLastIndex =
0
;
private
boolean
isSlidingToLast =
false
;
private
RecycleViewAdapter mAdapter;
private
ArrayList<Pair> mItem =
new
ArrayList<>();
private
StaggeredGridLayoutManager mLayoutManager;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyclerview);
ButterKnife.bind(
this
);
Fresco.initialize(
this
);
initRecycleView();
}
private
void
initRecycleView() {
mLayoutManager =
new
StaggeredGridLayoutManager(SPAN_COUNT, StaggeredGridLayoutManager.VERTICAL);
mRecycleView.setLayoutManager(mLayoutManager);
mAdapter =
new
RecycleViewAdapter(mItem);
loadData(
false
);
mRecycleView.setAdapter(mAdapter);
mRecycleView.setItemAnimator(
new
DefaultItemAnimator());
mAdapter.setOnRecycleViewItemClickListener(
new
RecycleViewAdapter.OnRecycleViewItemClickListener() {
@Override
public
void
onRecycleViewItemClick(View view,
int
position) {
long
id = mRecycleView.getChildItemId(view);
Log.d(TAG,
"View项的根视图:"
+ view.getClass().getName() +
",position="
+ position +
" ViewHolder_Id="
+ id);
SimpleDraweeView draweeView = (SimpleDraweeView) view.findViewById(R.id.info_image);
if
(
null
!= draweeView) {
draweeView.setImageURI(Uri.parse(RES_URL[
0
]));
Toast.makeText(RecycleViewActivity.
this
,
"通过findViewById查找View项中的元素"
, Toast.LENGTH_LONG).show();
}
RecycleViewItemHolder recycleViewItemHolder = (RecycleViewItemHolder) mRecycleView.findViewHolderForPosition(position);
if
(
null
!= recycleViewItemHolder) {
recycleViewItemHolder.infoTextView.setText(
"通过ViewHolder找到View项中的元素"
);
}
}
});
mRecycleView.setOnScrollListener(
new
RecyclerView.OnScrollListener() {
@Override
public
void
onScrollStateChanged(RecyclerView recyclerView,
int
newState) {
super
.onScrollStateChanged(recyclerView, newState);
if
(newState == RecyclerView.SCROLL_STATE_IDLE) {
if
(isPullToBottom() && isSlidingToLast) {
if
(mItem.size() >
36
) {
Toast.makeText(RecycleViewActivity.
this
,
"没有数据了"
, Toast.LENGTH_LONG).show();
return
;
}
else
{
loadData(
false
);
Log.d(TAG,
"notifyItemRangeInserted startPosition="
+ previousLastIndex);
mAdapter.notifyItemRangeInserted(previousLastIndex, PRE_SCREEN_NUMBER);
}
}
}
if
(newState == RecyclerView.SCROLL_STATE_SETTLING) {
Log.d(TAG,
"settling"
);
}
}
@Override
public
void
onScrolled(RecyclerView recyclerView,
int
dx,
int
dy) {
super
.onScrolled(recyclerView, dx, dy);
isSlidingToLast = dy >
0
;
Log.d(TAG,
"dx = "
+ dx +
" dy="
+ dy +
" isSlidingToLast="
+ isSlidingToLast);
}
}
);
}
private
boolean
isPullToBottom() {
int
[] lastIndexs = mLayoutManager.findLastCompletelyVisibleItemPositions(
null
);
Log.d(TAG,
"last item ="
+ Arrays.toString(lastIndexs) +
", have item="
+ mAdapter.getItemCount());
int
maxIndex = mAdapter.getItemCount() -
1
;
for
(
int
i : lastIndexs) {
if
(i == maxIndex) {
return
true
;
}
}
return
false
;
}
private
void
loadData(
boolean
isClear) {
if
(isClear) {
mItem.clear();
}
previousLastIndex = mItem.size();
Random r =
new
Random();
for
(
int
index =
0
; index < PRE_SCREEN_NUMBER && index < RES_URL.length; index++) {
mItem.add(
new
Pair(
"Card "
+ (previousLastIndex + index), RES_URL[r.nextInt(RES_URL.length)]));
}
Log.d(TAG,
"mItem count ="
+ mItem.size());
}
}