Android列表RecyclerView的用法

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));





發佈了49 篇原創文章 · 獲贊 27 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章