RecyclerView是谷歌在V7包裏添加的用於替代ListView的功能,同樣需要適配器傳入數據
一)RecyclerView的使用
使用Android Studio,創建項目之後,點擊Open Moduel Settings,選擇Dependies,點擊右上方的加號添加recyclerview-v7,就讓我們的項目引進了recyclerView.
接着創建一個簡單的RecyclerView,調用setAdapter()來傳入數據,三個重寫方法裏面使用了ViewHolder,來管理列表視圖
傳入了包含三行信息的字符數組
public class MainActivity extends AppCompatActivity {
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)); //給recyclerview設置佈局
rv.setAdapter(new RecyclerView.Adapter() {
//創建我們自己的ViewHolder,用來佈置我們想在列表裏顯示的內容
class ViewHolder extends RecyclerView.ViewHolder{
private TextView tv;
public ViewHolder(View itemView){
super(itemView);
tv= (TextView) itemView;
}
public TextView getTv(){
return tv;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(new TextView(parent.getContext())); //這裏的viewholder是我們自己寫的viewholder,傳入TextView
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ViewHolder vh= (ViewHolder) holder; //連接Viewholder
vh.getTv().setText(data[position]); //設置子項的內容
}
@Override
public int getItemCount() {
return data.length; //返回列表子項的數量
}
String data[]=new String[]{"liujaiwei","liujiahu","haishinia"};
});
}
}
二)使用資源文件自定義列表項
比如我們使用資源文件定義子項de內容爲兩個TextView,一個顯示標題文本,一個顯示內容文本
新建xml文件,命名爲cell_list,這就是我們在資源文件裏自定義的列表子項佈局
<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:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/tv1" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Small Text"
android:id="@+id/tv2" />
</LinearLayout>
接着在適配器里加載這個佈局,我們先把剛纔寫在活動裏的適配器重構,在Adapter裏點擊右鍵選擇Refactor-----move----ok,然後再對Adapter選擇Refactor-----move----refactor,就會重構出Adapter.java文件,在這裏改動一下View,構建數據集合的類型設置爲自定義的cellData類型
要注意的是,這裏加載子項佈局的方法和之前不同的地方在於,是通過LayoutInflater來加載佈局,而不是直接傳入TextView;而且給TextView進行setText的時候是通過cellData類型調用成員屬性title和content
這樣的好處是可以自定義列表項,我們可以在cellData裏設置多樣的數據,在cell_list佈局複雜的佈局,然後通過這種方法來傳給列表,那麼再複雜的列表佈局都可以做到,使用的更加靈活。
class MyAdapter extends RecyclerView.Adapter {
class ViewHolder extends RecyclerView.ViewHolder {
private View root;
private TextView tvTitle, tvContent;
public ViewHolder(View root) {
super(root);
tvTitle= (TextView) root.findViewById(R.id.tv1); //獲取資源文件
tvContent= (TextView) root.findViewById(R.id.tv2);
}
public TextView getTvContent() {
return tvContent;
}
public TextView getTvTitle() {
return tvTitle;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//佈置好佈局
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_cell,null)); //加載子項佈局
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ViewHolder vh = (ViewHolder) holder;
cellData cd=Data[position];
vh.getTvContent().setText(cd.content);
vh.getTvTitle().setText(cd.title);
}
@Override
public int getItemCount() {
return Data.length;
}
private cellData[] Data=new cellData[]{new cellData("新聞","莫言獲得諾貝爾文學獎"),
new cellData("新聞","曹文軒獲得安徒生文學獎"),
new cellData("新聞","劉家威獲得矛盾文學獎")};
}
cellData類是存放子項數據的類
public class cellData {
public String title;
public String content;
public cellData(String title,String content){
this.title=title;
this.content=content;
}
}
結果如下
三)RecyclerView的佈局樣式
我們可以使用V7包的setLayoutManager來給RecyclerView佈置不同類型的佈局樣式
比如
rv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false)); //給recyclerview設置佈局
這樣在水平方向列表,可以左右滑動,這裏的LinearLayoutManager()的三個參數,第一個是上下文,第二個是佈局,有水平佈局或者垂直佈局,或者其他網格佈局類型,第三個是是否反轉,如果選擇false的話,數據的順序是正常的,選擇true就是倒過來的,比如當選擇false的時候效果如左圖,選擇true效果如右圖
V7包還有網格佈局,參數的第二個表示幾列,效果如下圖,如果數據很多的話,可以上下拖動的。
rv.setLayoutManager(new GridLayoutManager(this,3));