<pre name="code" class="java" style="font-size: 24px; font-weight: bold; text-align: center;">
RecyclerView知識點小解
在現在的App中, 到處可見RecyclerView的身影, 幾乎已經把傳統的ListView給迭代更新掉了。
由此可見該組件的重要性。 這篇文章主要就是把RecyclerView的基本知識點給講解一下, 已經如何使用RecyclerView。
一、注意
該組件是Android超級庫裏面的, 想要使用需要先把該組件導入工程,本人用的IDE是Android Studio, 最好大家不要採用Eclipse進行開發,
因爲Google之前在Eclipse寫的ADT太老了。 就算你引用了該組件的JIRA, 編譯的時候它也帶入不進去。
二、導入
在當前工程的Window找到 File --> Project Structure...會彈出一個新窗口, 點擊左邊的app --> Dependencies --> '+'(加號) -->
選第一個 --> 找到你要的RecyclerView組件點擊OK即可、
因爲大多人都知道怎麼導入的, 爲了方便就不上圖片版的嘞。
三、與傳統的ListView進行比較
傳統的ListView在進行視圖複用中並沒有硬性要求, 你可以進行視圖緩存, 也可以不進行。
但是RecyclerView就提供了一個類爲RecyclerView.ViewHolder. 你必須按照視圖緩存方式進行處理。
定製Item視圖項, ListView只能實現垂直性排列的列表視圖, 然而RecyclerView則是通過RecyclerView.LayoutManager進行展示,
只要你能寫的出, 就沒有辦不到的視圖呈現方式。 (單單就這一點就可以吧ListView給捨棄了)
Item動畫, 還記得在ListView中寫動畫的時候需要考慮的複雜因素, 而且ListView也沒有提供任何方便開發者的接口,
相反的, 可以通過RecyclerView.ItemAnimator來設置每個條目的展示動畫。
適配器, 在ListView中有太多的Adapter告訴開發者, 遊標適配器、 基本適配器... 太多了, RecycerView就可以讓我們開發自己提供
數據集, RecyclerView.Adapter。 這樣就可以不需要管那麼多Adapter該用什麼好了。(我學習ListView的時候, 被這個搞破了腦子)
設置每個Item條目的分割線, ListView中可以設置android:driver屬性來控制每個Item可有的分割線, RecyclerView提供了
Recycler.ItemDecoration來控制每個條目的分割效果。(我基本上都是直接採用每個Item的margin或padding的方式進行分割)
Item點擊事件, ListView可以直接設置OnItemClickListener方法, 在RecyclerView就可以設置OnItemTouchListener。 明顯RecyclerView可以
進行的邏輯操作更多。
四、 基礎知識點
RecyclerView.Adapter扮演者重要的角色, 一般我們着重重寫他的兩個方法。onCreateViewHolder, onBindViewHolder。
public ViewHolder onCreateViewHolder(...)創建Item視圖, 並返回響應的ViewHolder
public void onBindViewHolder(....) 綁定當前Item的視圖展示項。
RecyclerView.LayoutManager 負責Item的展示, 以及何時回收。 每個RecyclerView必須指定一個LayoutManager, 否則會拋出異常。
LinearLayoutManager : 水平或者垂直的Item視圖。
GridLayoutManager:
網格Item視圖
StaggereGridLayoutManager交錯的網格Item視圖。
當然還有一些很實用的API:
findFirstVisibleItemPosition()
返回當前第一個可見Item的position
findFirstCompletelyVisibleItemPosition()
返回當前第一個完全可見Item的position
findLastVisibleItemPosition()
返回當前最後一個可見Item的position
findLastCompletelyVisibleItemPosition()
返回當前最後一個完全可見Item的position
五、使用
<span style="font-family:Microsoft YaHei;font-size:14px;">public class MainActivity extends Activity {
private RecyclerView mRecyView;
private List<String> mDatas;
private MyRecyclerViewAdapter mRecyViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initDatas();
mRecyViewAdapter = new MyRecyclerViewAdapter(this, mDatas);
mRecyView.setAdapter(mRecyViewAdapter);
mRecyView.setLayoutManager(new GridLayoutManager(this, 2));
}
private void initDatas() {
mDatas = new ArrayList<String>();
mDatas.add(0, "Android");
mDatas.add(1, "IOS");
mDatas.add(2, "Java");
mDatas.add(3, "C");
mDatas.add(4, "C++");
mDatas.add(5, "C#");
mDatas.add(6, "HTML");
mDatas.add(7, "CSS");
mDatas.add(7, "JavaScript");
}
private void initView() {
mRecyView = (RecyclerView) this.findViewById(R.id.main_recy_view);
}
}</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
private Context mContext;
private List<String> mDatas;
private LayoutInflater mLayoutInflater;
public MyRecyclerViewAdapter(Context ctx, List<String> datas){
this.mContext = ctx;
this.mDatas = datas;
mLayoutInflater = LayoutInflater.from(mContext);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(mLayoutInflater.inflate(R.layout.main_recy_view_layout, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTv.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas == null ? 0 : mDatas.size();
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
private TextView mTv;
public ViewHolder(View itemView) {
super(itemView);
mTv = (TextView) itemView.findViewById(R.id.main_recy_view_tv);
mTv.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id){
case R.id.main_recy_view_tv:
Toast.makeText(mContext, ((TextView) v).getText().toString(), Toast.LENGTH_SHORT).show();
break;
}
}
}
}</span>
運行效果:
大家可切換不同的LayoutManager進行查看效果。