1,概述
RecyclerView可以完全代替ListView、GridView,整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設置它提供的不同LayoutManager,ItemDecoration , ItemAnimator實現很多讓人驚艷的效果,而且實現效果也是非常的簡單。(隨便百度了一段話)
2,直接進入使用篇:
首先,創建好project
我們要想使用它,就要添加相應的依賴庫。右擊app


點那個加號,找到
3,代碼部分很簡潔,只放了一個簡單的綁定數據,后續的在學習,現在只是搞清楚這個布局如何呈現出了,然后能夠呈現一定的內容~
代碼部分有注釋,就不說什么了。
package examples.ouc.com.learnrv; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class MainActivity extends AppCompatActivity { //用來代替ListView private RecyclerView rv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); rv= new RecyclerView(this); setContentView(rv); rv.setLayoutManager( new LinearLayoutManager(this)); rv.setAdapter(new RecyclerView.Adapter() { class ViewHolder extends RecyclerView.ViewHolder{ private TextView tv; public ViewHolder(TextView itemView) { super(itemView); tv = itemView; } public TextView getTv() { return tv; } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(new TextView(parent.getContext())); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ViewHolder vh = (ViewHolder) holder; vh.getTv().setText("item "+position); } //huoqu ziduixiang shuliang @Override public int getItemCount() { return 10; } }); } }
4,上述書通過直接代碼創建布局,然后載入,但是大部分時間,還是通過xml布局文件控制比較方便
我們首先將上面的代碼進行一下重構,將adapter沖構成一個類,使代碼更簡潔~
這里面有很多注釋之類的,是跟着極客學院學習時候留下的,不過沒有影響,這只會影響我們的布局情況,並不會影響實現功能!
1 package examples.ouc.com.learnrecylerview; 2 3 4 import android.os.Bundle; 5 import android.support.v7.app.AppCompatActivity; 6 import android.support.v7.widget.GridLayoutManager; 7 import android.support.v7.widget.LinearLayoutManager; 8 import android.support.v7.widget.RecyclerView; 9 10 public class MainActivity extends AppCompatActivity { 11 12 private RecyclerView rv; 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 18 rv = new RecyclerView(this); 19 setContentView(rv); 20 21 //設置布局 22 //第一個參數獲取布局,第二個參數表示數值還是水平,第三個是否反轉 23 // rv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false)); 24 25 //第一個參數獲取布局,第二個表示有幾列(默認是垂直方向) 26 rv.setLayoutManager(new GridLayoutManager(this,3)); 27 28 //rv.setLayoutManager(new GridLayoutManager(this,3,LinearLayoutManager.HORIZONTAL,false)); 29 //添加內容 30 rv.setAdapter(new MyAdapter()); 31 } 32 33 }
然后是MyAdapter
1 package examples.ouc.com.learnrecylerview; 2 3 import android.support.v7.widget.RecyclerView; 4 import android.view.LayoutInflater; 5 import android.view.View; 6 import android.view.ViewGroup; 7 import android.widget.TextView; 8 9 import org.w3c.dom.Text; 10 11 /** 12 * Created by Huskyboy on 2016/11/19. 13 */ 14 class MyAdapter extends RecyclerView.Adapter { 15 16 class ViewHolder extends RecyclerView.ViewHolder { 17 //綁定子對象的視圖 18 private View root; 19 private TextView tvTitle,tvContent; 20 21 public ViewHolder(View root) { 22 super(root); 23 tvTitle = (TextView) root.findViewById(R.id.tvTitle); 24 tvContent = (TextView) root.findViewById(R.id.tvContent); 25 } 26 27 public TextView getTvContent() { 28 return tvContent; 29 } 30 31 public TextView getTvTitle() { 32 return tvTitle; 33 } 34 } 35 36 //創建holder 37 @Override 38 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 39 //布局解析器 40 return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_cell,null)); 41 } 42 43 //對holder的textView進行操作 44 @Override 45 //第一個參數是我們綁定的holder 46 //第二個是一個索引,我們的當前初始化的數據是哪一條 47 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 48 49 //注意這里引入的ViewHolder類是我們上面創建的類,不要加錯包 50 ViewHolder vh = (ViewHolder) holder; 51 52 CellData cd = data[position]; 53 vh.getTvTitle().setText(cd.title); 54 vh.getTvContent().setText(cd.content); 55 56 } 57 58 //獲取RecylerView子對象數量 59 @Override 60 public int getItemCount() { 61 return data.length; 62 } 63 64 private CellData[] data = new CellData[]{new CellData("iCyhuSky"," 1995-06-19"), 65 new CellData("news ", "Nice")}; 66 }
CellData.java
1 package examples.ouc.com.learnrecylerview; 2 3 /** 4 * Created by Huskyboy on 2016/11/19. 5 */ 6 7 public class CellData { 8 public CellData(String title, String content){ 9 this.content = content; 10 this.title = title; 11 } 12 13 public String title = "title"; 14 public String content = "content"; 15 }
布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvTitle" /> <TextView android:text="tvComtent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvContent" /> </LinearLayout>
5,這里注意一點是,在重寫MyAdapter的時候,
public int getItemCount() { return data.length; }
這個返回的數量一定要與Data數組相對應,否則會報錯,無法加載布局!
最后附上CSDN上面一些大神的講解
http://so.csdn.net/so/search/s.do?ref=toolbar&q=RecyclerView&ref=toolbar&q=RecyclerView
