一.普通的recyclerview創建.
- 在build.gradle裏面添加依賴庫支持.
compile 'com.android.support:design:24.2.1'
- 佈局文件裏面寫上控件.
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
3.設置佈局管理器.
- LinearLayoutManager 普通的線性佈局管理器,效果類似listview
- GridLayoutManager 多行顯示的佈局管理器,其效果類似於grideview
- StaggeredGridLayoutManager 實現瀑布流的佈局管理器
// 創建一個線性佈局管理器
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
// 默認是Vertical,可以不寫(這裏的作用就是用來控制顯示的方式是橫屏顯示還是豎屏顯示的)
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//如果可以確定每個item的高度是固定的,設置這個選項可以提高性能
recy.setHasFixedSize(true);
// 設置佈局管理器
recy.setLayoutManager(layoutManager);
4.給這個recycerView設置數據的適配器.
// 創建Adapter,並指定數據集
mAdapter = new MyAdapter(dataset);
// 設置Adapter
recy.setAdapter(mAdapter);
這個數據的適配器同樣的是具有刷新數據的功能的.
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
// 數據集
private String[] mDataset;
//構造函數
public MyAdapter(String[] dataset) {
super();
//拿到上個界面傳遞過來的數據
mDataset = dataset;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
//將item的佈局加載進來你
View view = View.inflate(viewGroup.getContext(), R.layout.item, null);
// 創建一個ViewHolder,將界面和上下文傳遞過去
ViewHolder holder = new ViewHolder(view, viewGroup.getContext());
return holder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
// 綁定數據到ViewHolder上(這裏是做綁定數據的時候的用的)
viewHolder.tv.setText(mDataset[i]);
}
@Override
public int getItemCount() {
//這裏是返回這個條目的長短的是多少的
return mDataset.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView tv;
public ViewHolder(View itemView, final Context context) {
super(itemView);
//將item裏面的控件找到
tv = (TextView) itemView.findViewById(R.id.tv);
//這裏是給這個條目設置點擊的事件,這裏也可以使用其他的方式來,比如是定義一個接口來實現
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "第" + getPosition() + "個條目被點擊了", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, TesstTwo.class);
context.startActivity(intent);
}
});
}
}
}
二.給recylerView添加頭尾佈局.
public class Myadapter extends RecyclerView.Adapter<Myadapter.ViewHoler> {
public static final int TYPE_FOOT = 1;
public static final int TYPE_NORMAl = 2;
private View mFootView;
private Context mContext;
@Override
public Myadapter.ViewHoler onCreateViewHolder(ViewGroup parent, int viewType) {
mContext = parent.getContext();
if (mFootView != null && viewType == TYPE_FOOT) {
return new ViewHoler(mFootView);
}
View view = View.inflate(getActivity(), R.layout.cardinfo_item, null);
ViewHoler viewHoler = new ViewHoler(view);
return viewHoler;
}
@Override
public void onBindViewHolder(Myadapter.ViewHoler holder, final int position) {
if (position == list.size()) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "底部按鈕點擊事件", Toast.LENGTH_SHORT).show();
}
});
} else {
//油卡充值和刪除按鈕
ImageView rec = (ImageView) holder.itemView.findViewById(R.id.mcb_oil_rec);
ImageView delete = (ImageView) holder.itemView.findViewById(R.id.mcb_oil_delete);
//油卡所有的類型
((TextView) holder.itemView.findViewById(R.id.mcb_oil_tv_cardname)).setText(list.get(position));
//油卡充值界面
rec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().finish();
startActivity(new Intent(getActivity(), GasolineActivity.class));
getActivity().overridePendingTransition(R.anim.activity_in, R.anim.activity_out);
}
});
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "第" + position + "條目刪除點擊", Toast.LENGTH_SHORT).show();
list.remove(position);
notifyDataSetChanged();
}
});
}
}
@Override
public int getItemCount() {
return list.size() + 1;
}
@Override
public int getItemViewType(int position) {
if (mFootView == null)
return TYPE_NORMAl;
if (position == list.size())
return TYPE_FOOT;
return TYPE_NORMAl;
}
public class ViewHoler extends RecyclerView.ViewHolder {
private View itemView;
public ViewHoler(View itemView) {
super(itemView);
this.itemView = itemView;
}
}
public void setFootView(View footView) {
this.mFootView = footView;
notifyItemChanged(0);
}
}
使用方式:
Myadapter myadapter = new Myadapter();
View footView = View.inflate(getActivity(), R.layout.oilcard_info_foot, null);
myadapter.setFootView(footView);
三.recyclerview使用單選框.
holder.checkBox.setTag(new Integer(position));
if (checkPositionlist != null) {
holder.checkBox.setChecked((checkPositionlist.contains(new Integer(position)) ? true : false));
} else {
holder.checkBox.setChecked(false);
}
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (!checkPositionlist.contains(holder.checkBox.getTag())) {//這句要有 ,否則不復用了,但是你再滑動回去的時候,都成了爲選中。這是因爲你的item滑出可視範圍時,就會觸發oncheckchange事件,所以用第一步綁定的tag進行二次判斷。防止選中的丟失
checkPositionlist.add(new Integer(position));
}
} else {
if (checkPositionlist.contains(holder.checkBox.getTag()))//這句同上,二次判斷{
checkPositionlist.remove(new Integer(position));
}
}
});
四.recyclerview使用滑動到底部加載更多.
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
boolean isPullUp = false;
boolean isRefreshing = false;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
isPullUp = dy >= 0;
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
//super.onScrollStateChanged(recyclerView, newState);
if (isPullUp && !isRefreshing && mAdapter.hasMoreData()) {
//如果是在向下滑動沒有正在刷新有更多的數據
int lastPos = mLinearLayoutManager.findLastVisibleItemPosition();//獲取到最後一個條目的索引值
if (lastPos > mDataList.size() - 2) {
//最後一個位置的時候加載更多
mAdapter.setHasFooter(true);//設置有尾佈局
isRefreshing = true;//設置刷新的狀態是正在刷新
//假數據
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
isRefreshing = false;//將刷新的狀態更改爲false
int position = mDataList.size();//拿到集合刷新前的總長度
for (int x = 0; x < 30; x++) {
mDataList.add("測試代碼" + (mDataList.size()));
}
//控制什麼時候不加載更多的數據
if (mDataList.size() > 100) {
//如果集合的中長度>100設置沒有更多的數據了
mAdapter.setHasMoreDataAndFooter(false, true);
}
mRecyclerView.scrollToPosition(position);//然rcview滾動到加載數據的起始位置來
}
}, 2000);
}
}
}
});
}
public abstract class SimpleStringRecyclerViewAdapter<T> extends RecyclerView.Adapter {
private static final int TYPE_FOOTER = Integer.MIN_VALUE + 1;
private ArrayList<T> mValues;
private boolean hasFooter = false;
//標記有更多的數據
private boolean hasMoreData = false;
//構造函數拿到數據源
public SimpleStringRecyclerViewAdapter(ArrayList<T> items) {
mValues = items;
}
@Override
public int getItemCount() {
return mValues.size() + (hasFooter ? 1 : 0);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Log.d("---", "viewType==" + viewType);
if (viewType == TYPE_FOOTER) {
//有footview,找到佈局返回holder
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_view_load_more, parent, false);
return new FooterViewHolder(view);
} else {
//普通的佈局視圖.找到佈局返回holder
return onCreate(parent, viewType);
}
}
public abstract RecyclerView.ViewHolder onCreate(ViewGroup parent, final int viewType);
public abstract void onBind(RecyclerView.ViewHolder viewHolder, int Position, T data);
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof SimpleStringRecyclerViewAdapter.ItemViewHolder) {
final T data = mValues.get(position);
//普通條目的holder
onBind(holder, position, data);
} else {
//尾部的holder
if (hasMoreData) {
//如果有更多的數據顯示進度條.設置文字爲加載中
((FooterViewHolder) holder).mProgressView.setVisibility(View.VISIBLE);
((FooterViewHolder) holder).mTextView.setText("加載中");
} else {
//如果沒有數據設置進度條隱藏,設置沒有更多數據了
((FooterViewHolder) holder).mProgressView.setVisibility(View.GONE);
((FooterViewHolder) holder).mTextView.setText("數據加載完畢!");
}
}
}
@Override
public int getItemViewType(int position) {
//如果position和數據源的最後一個相等且有爲佈局
if (position == getBasicItemCount() && hasFooter) {
//返回有尾type
return TYPE_FOOTER;
}
//返回普通的type
return super.getItemViewType(position);
}
//得到集合的總長度
public int getBasicItemCount() {
//返回集合的長度
return mValues.size();
}
//普通視圖的holder
public class ItemViewHolder extends RecyclerView.ViewHolder {
public ItemViewHolder(View view) {
super(view);
}
}
//尾部的holder
public class FooterViewHolder extends RecyclerView.ViewHolder {
public final ProgressBar mProgressView;
public final TextView mTextView;
//構造函數拿到佈局裏面的控件
public FooterViewHolder(View view) {
super(view);
mProgressView = (ProgressBar) view.findViewById(R.id.progress_view);
mTextView = (TextView) view.findViewById(R.id.tv_content);
}
}
/**
* 調用該方法回去是否有footer
*
* @return
*/
public boolean hasFooter() {
return hasFooter;
}
/**
* 設置有沒有footview
*
* @param hasFooter
*/
public void setHasFooter(boolean hasFooter) {
if (this.hasFooter != hasFooter) {
this.hasFooter = hasFooter;
notifyDataSetChanged();
}
}
/**
* 獲取是否有更多數據
*
* @return
*/
public boolean hasMoreData() {
//返回標記值
return hasMoreData;
}
/**
* 設置是否有更多數據
*
* @param isMoreData
*/
public void setHasMoreData(boolean isMoreData) {
if (this.hasMoreData != isMoreData) {
this.hasMoreData = isMoreData;
notifyDataSetChanged();
}
}
/**
* 設置是否有更多的數據和尾佈局
*
* @param hasMoreData
* @param hasFooter
*/
public void setHasMoreDataAndFooter(boolean hasMoreData, boolean hasFooter) {
if (this.hasMoreData != hasMoreData || this.hasFooter != hasFooter) {
this.hasMoreData = hasMoreData;
this.hasFooter = hasFooter;
notifyDataSetChanged();
}
}
}
五.監聽recylerView是否滾動到底部
rc.addOnScrollListener(new RecyclerView.OnScrollListener() {
boolean isSlidingToLast = false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
// 當不滾動時
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
//獲取最後一個完全顯示的ItemPosition
int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
int totalItemCount = manager.getItemCount();
// 判斷是否滾動到底部,並且是向右滾動
if (lastVisibleItem == (totalItemCount - 1) && isSlidingToLast) {
//加載更多功能的代碼
Toast.makeText(MainActivity.this, "滾動到了底部", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//判斷滾動的方向是否是正Y方向在滾動
if (dy > 0) {
isSlidingToLast = true;
} else {
isSlidingToLast = false;
}
}
});
六.判斷recylerView是否滾動到了一定的高度.
boolean flag = true;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
isPullUp = dy > 0;
if (scolly > 3000 && flag) {
flag = false;
Toast.makeText(MainActivity.this, "滑動距離超過1000了", Toast.LENGTH_SHORT).show();
Log.d("--", "超過3000");
}
if (scolly < 1000 && !flag) {
flag = true;
Log.d("--", "少於3000");
}
scolly += dy;
七.recyclerView返回頂部.
list.smoothScrollToPosition(0);//一般使用該方法
mRecyclerView.scrollBy(0, -x);//x爲滑動的距離