recyclerview總結

一.普通的recyclerview創建.

  1. 在build.gradle裏面添加依賴庫支持.
 compile 'com.android.support:design:24.2.1'
  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爲滑動的距離
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章