Google在推出Android5.0的時(shí)候推出了Material Design ,而RecyclerView是Material Design重要組件之一。當(dāng)然還有CardView/Palette。
創(chuàng)新互聯(lián)公司是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶(hù)提供優(yōu)質(zhì)的服務(wù)器托管服務(wù)
RecyclerView是用來(lái)替換傳統(tǒng)的ListView和GridView,瀑布流效果的。是的RecyclerView這一個(gè)控件,可以實(shí)現(xiàn)這三個(gè)效果。雖然在開(kāi)始使用recyclerview的時(shí)候會(huì)感到有些男,但是用熟練了會(huì)發(fā)現(xiàn)recyclerview十分強(qiáng)大。它可以給每一item里面的控件設(shè)置點(diǎn)擊時(shí)間,而不需要擔(dān)心事件沖突的問(wèn)題,如果是使用listview或者是gridview就必須要解決事件沖突,甚至listview或gridview的item只能設(shè)置一個(gè)點(diǎn)擊事件,否則就會(huì)造成事件沖突,而這些沖突并不好解決。所以recyclerview來(lái)了。
首先在項(xiàng)目中集成RecyclerView,在build.gradle添加RecyclerView的依賴(lài)
compile 'com.android.support:recyclerview-v7:23.2.1'
這樣項(xiàng)目中就集成 recyclerview了,Android Studio 會(huì)自動(dòng)聯(lián)網(wǎng)下載 recyclerview包。
在activity_main.xml中,使用recyclerview.
布局中已經(jīng)有了recyclerview的控件,下面就開(kāi)始在代碼中編寫(xiě)。
在這里解釋一下recyclerview的使用。就像listview那樣,recyclerview也需要一個(gè)適配器;在我們優(yōu)化listview的時(shí)候,我們經(jīng)常會(huì)使用到一個(gè)內(nèi)部類(lèi)ViewHolder來(lái)保存item中的控件,以便于item的復(fù)用。而現(xiàn)在recyclerview則必須使用ViewHolder。這個(gè)ViewHolder必須繼承RecyclerView.ViewHolder,RecyclerView.ViewHolder有一個(gè)參數(shù)的構(gòu)造方法,傳入的是一個(gè)view,這個(gè)view 就是recyclerview的item。
RecyclerViewHolder:
public class RecyclerViewHolder extends RecyclerView.ViewHolder { public TextView textView; public ImageView p_w_picpathView; public RecyclerViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.textView); p_w_picpathView = (ImageView) itemView.findViewById(R.id.p_w_picpathView); } }
RecyclerViewHolder寫(xiě)好之后就開(kāi)始寫(xiě)Adapter.同樣RecyclerAdapter需要繼承RecyclerView.Adapter
public class RecyclerAdapter extends RecyclerView.Adapter{ private List
MainActivity中的代碼。
public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; //使用線(xiàn)性布局管理器,設(shè)置的方向orientation是默認(rèn),即垂直方向 private LinearLayoutManager manager; //適配器 private RecyclerAdapter adapter; //數(shù)據(jù)源 private List> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); manager = new LinearLayoutManager(this); adapter = new RecyclerAdapter(); //設(shè)置布局管理器 recyclerView.setLayoutManager(manager); //給recyclerview設(shè)置適配器 recyclerView.setAdapter(adapter); list = new ArrayList<>(); for (int i=0;i<50;i++) { Map map = new HashMap<>(); map.put("data", "item--> "+i); list.add(map); } adapter.addAll(list); adapter.notifyDataSetChanged(); } }
recyclerview實(shí)現(xiàn)listview的效果就完成了,運(yùn)行效果:
如果是想每個(gè)item橫向滑動(dòng)的話(huà),只需要使用LinearLayoutManager的三個(gè)參數(shù)的構(gòu)造方法就行了,new LInearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)就可以實(shí)現(xiàn)橫向滑動(dòng)的效果了。
recyclerView實(shí)現(xiàn)GridView的效果。需要是用是GridLayoutManager。將recyclerView的布局管理器更換成GridLayoutManager manager = new GridLayoutManager(this, 2),效果圖如下:
給RecyclerView添加滾動(dòng)監(jiān)聽(tīng)。與listView和gridView有寫(xiě)不同,recyclerView判斷滾動(dòng)到哪一個(gè)位置的餓時(shí)候,需要使用到使用到布局管理器(前面設(shè)置的recyclerview.setLayoutManager())。滾動(dòng)監(jiān)聽(tīng)的方法有兩個(gè),setOnScrollListener(已不推薦使用)和addOnScrollListener。兩個(gè)方法本質(zhì)上是一致的。代碼如下:
recyclerView_follow.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); //滾動(dòng)的狀態(tài)改變時(shí),調(diào)用此方法。 } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //屏幕中最下面一個(gè)item的所在數(shù)據(jù)源的位置(postion)。 int lastVisiableItem = manager.findLastVisibleItemPosition(); //一共有多少個(gè) int totalItemCount = manager.getItemCount(); //當(dāng)滑動(dòng)到倒數(shù)第二個(gè)item時(shí),即聯(lián)網(wǎng)獲取下一頁(yè)的數(shù)據(jù) if (lastVisiableItem >= totalItemCount - 2 && dy > 0) { page++;//第二頁(yè) reloadData(page); } } });
給RecyclerView添加監(jiān)聽(tīng)事件:
首先在Adapter中的onBindViewHolder方法中設(shè)置點(diǎn)擊事件,使用holder.xxx.setOnClickListener()設(shè)置點(diǎn)擊事件.RecyclerView避免了事件的沖突問(wèn)題,可以給每個(gè)item中的控件設(shè)置點(diǎn)擊事件.