RecyclerView 是 Android 團隊新推出的控件,不只能輕鬆實現 ListView 的一樣的效果,還優化了 ListView 中許多不足之處。
目前 Android 團隊是更推薦咱們使用 Recycler 的。java
爲了能在多版本的 Android 系統中使用,Android 團隊把它定義在了 support 庫中,想要使用須要在 build.gradle 中添加依賴庫。android
在 Android Studio 中選用 Project Files 視圖,打開 app/build.gradle 文件,在 dependencies 閉包中添加
compile 'com.android.support:recyclerview-v7:24.2.1'
閉包
而後點一下 Sncy Now 來進行同步,而後修改 activity_main.xmlapp
<android.support.v7.widget.RecyclerView android:id="@+id/hero_recycler" android:layout_width="match_parent" android:layout_height="match_parent" />
這裏 AS(Android Studio)很是方便的提示了剩下的代碼,很方便函數
而後像 ListView 同樣,爲它設計一個子項樣式,新建一個 hero_item.xml
hero_item.xml佈局
<ImageView android:id="@+id/hero_image" android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@mipmap/ic_launcher" /> <TextView android:id="@+id/hero_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="TextView" />
固然還要一個實體類用來作爲 RecyclerView 的適配類型
Hero.javagradle
public class Hero { private String name; private int imageId; public Hero(String name, int imageId) { this.name = name; this.imageId = imageId; } public void setName(String name) { this.name = name; } public void setImageId(int imageId) { this.imageId = imageId; } public String getName() { return name; } public int getImageId() { return imageId; } }
而後就要爲 Recycler 準備一個適配器了優化
新建一個 HeroAdapter.java,而後讓這個適配器類繼承 RecyclerView.Adapter,並將泛型指定爲 HeroAdapter.ViewHolder。
其中 ViewHoler 是咱們在 HeroAdapter 定義的一個內部類ui
HeroAdapter.javathis
public class HeroAdapter extends RecyclerView.Adapter<HeroAdapter.ViewHolder> { private List<Hero> mHerolist; static class ViewHolder extends RecyclerView.ViewHolder { View heroView; ImageView hero_image; TextView hero_name; public ViewHolder(View itemView) { super(itemView); heroView=itemView; hero_image= (ImageView) itemView.findViewById(R.id.hero_image); hero_name= (TextView) itemView.findViewById(R.id.hero_text); } } public HeroAdapter(List<Hero> heroList){ mHerolist=heroList; } public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.hero_item,parent,false); ViewHolder holder=new ViewHolder(view); return holder; } public void onBindViewHolder(ViewHolder holder, int position) { Hero hero=mHerolist.get(position); holder.hero_image.setImageResource(hero.getImageId()); holder.hero_name.setText(hero.getName()); } public int getItemCount() { return mHerolist.size(); } }
上面代碼看着不少,其實大部分 AS會幫咱們寫好,而且代碼邏輯清晰,很好理解。
首先定義一個內部類 ViewHolder,而後這個內部類要繼承 RecyclerView.ViewHolder,而後要傳入一個構造函數 View,這個參數一般是 RecyclerView 的子項最外層佈局,因此咱們能夠經過 findViewById 來獲取佈局中的實例。
接着要有個構造函數 HeroAdapter,做用是把 RecyclerView 的數據源傳進來,並賦給一個全局變量,做爲全局數據,由於咱們後續操做都須要這數據源。
最後是繼承了 RecyclerView.Adapter 要重寫的三個方法:
onCreateViewHolder 是用於建立 ViewHolder 實例的。
咱們先把 hero_item.xml 加載進來
代碼已經在 ListView 那篇解釋過了
而後建立一個 ViewHodler 實例,並把加載出來的 View 佈局添加到 ViewHoder 裏面去,最後返回 ViewHodler 的實例。
onBindViewHolder 主要用來綁定數據
咱們經過 position 得出當前項的數值,而後綁定便可。
getItemCount 用於告訴 RecyclerView 有多少項,直接返回數據源長度便可。
最後咱們來到 MainActivity.java 中
MainActivity.java
public class MainActivity extends AppCompatActivity { private List<Hero> heroList=new ArrayList<>(); protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initHero(); >>** RecyclerView recyclerView= (RecyclerView) findViewById(R.id.hero_recycler); **<< LinearLayoutManager layoutManager=new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); HeroAdapter heroAdapter=new HeroAdapter(heroList); recyclerView.setAdapter(heroAdapter); } public void initHero(){ for (int i=0;i<2;i++) { Hero lin=new Hero("lin",R.drawable.b2); heroList.add(lin); Hero delia=new Hero("delia",R.drawable.b3); heroList.add(delia); Hero fire=new Hero("fire",R.drawable.b4); heroList.add(fire); Hero saber=new Hero("saber",R.drawable.b5); heroList.add(saber); Hero christina=new Hero("christina",R.drawable.b6); heroList.add(christina); Hero dva=new Hero("dva",R.drawable.b9); heroList.add(dva); } } }
代碼比較簡單,就不解釋了 ***