Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 安卓開發之RecyclerView,安卓recyclerview

安卓開發之RecyclerView,安卓recyclerview

編輯:關於android開發

安卓開發之RecyclerView,安卓recyclerview


RecyclerView是一個非常好用的控件,它的效果和ListView很相似,甚至可以說RecyclerView的出現是來取代ListView的

RecyclerView比ListView更加靈活,具有更高的擴展性

下面就詳細的介紹RecyclerView的用法

既然RecyclerView上來取帶ListView的那說明RecyclerView和ListView的用法很相似,事實確實這樣,也就是兩個東西,一個控件和適配器(Adapter)

一:導包

我這裡開發使用的AndroidStudio,再使用RecyclerView之前要先引入RecyclerView的包(這個是必須的,也是不用解釋的)

在build文件中找到dependencies代碼塊,添加compile 'com.android.support:recyclerview-v7:23.0.0'這句話,重新構建項目就可以使用RecyclerView了

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:recyclerview-v7:23.0.0'
}

二:寫xml文件

做完上面的工作就可以開始寫代碼了,首先創建一個Activity同時生成xml布局文件,在布局文件中寫入RecyclerView控件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>
</RelativeLayout>

再寫上面的代碼是RecyclerView的時候不能直接寫RecyclerView,必須加上前面的android.support.v7.widget,如果記不起前面的內容,給你說一種簡便方法,現在Activity中聲明一個變量RecyclerView

 

可以看到聲明了RecyclerView之後上面的import就會自動生成,import後面的內容就是RecyclerView的全路徑了。

三:寫適配器類

首先創建一個類繼承自RecyclerView.Adapter

相信在ListView中已經很熟悉ViewHolder這個類了,在RecyclerView的Adapter中ViewHolder內置了,所以先不要管什麼,必須先寫一個ViewHolder內部類繼承自RecyclerView.ViewHolder,重寫構造函數,這個時候先不要急實現Adapter的抽象方法

public class MyRecyclerViewAdapter extends RecyclerView.Adapter {
    
    class MyViewHolder extends RecyclerView.ViewHolder{

        public MyViewHolder(View itemView) {
            super(itemView);
        }
    }
}

做完上面的再去將我們寫的ViewHolder給Adapter綁上,就是RecyclerView.Adapter後面尖括號的內容

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {

    class MyViewHolder extends RecyclerView.ViewHolder{

        public MyViewHolder(View itemView) {
            super(itemView);
        }
    }
}

昨晚上面的步驟再去實現Adapter的抽象方法

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        return null;
    }

    @Override
    public void onBindViewHolder(MyViewHolder myViewHolder, int i) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

    class MyViewHolder extends RecyclerView.ViewHolder{

        public MyViewHolder(View itemView) {
            super(itemView);
        }
    }
}

如果先去實現了上面的抽象方法,不先做上面的步驟你會很麻煩,甚至可能會思維混亂不知所措

這樣這個Adapter類基本成型了,下面來介紹這些方法的作用

首先onCreateViewHolder()這個方法看名字就知道是用來創建ViewHolder類的,上面雖然寫出了ViewHolder類但是還沒有生成實例,也就是new的過程所以這個方法就是用來new ViewHolder的,看myViewHolder有一個構造方法,構造方法裡面有一個View的對象,所以在這裡創建ViewHolder的時候要傳入一個參數,這裡的這個View很簡單就是你RecyclerView的每一項的View的對象,用LayoutInflater加載,最後返回ViewHolder

其次onBinderViewHolder();這裡面有兩個參數MyViewHolder myViewHolder 你生成的ViewHolder實例, int i 代表目前是哪一行,所以這個方法是來給ViewHolder裡面的控件賦值的

再看getItemCount();就是確定你這個RecyclerView有多少行

MyViewHolder是初始化每一行空間的地方

將上面的方法都實現就形成了下面的Adapter類

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private List<String> mList;
    private Context context;
    public MyAdapter(List<String> mList,Context context){
        this.mList = mList;
        this.context = context;
    }
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.item,viewGroup,false);
        MyViewHolder viewHolder = new MyViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder myViewHolder, int i) {
        myViewHolder.tv_msg.setText(mList.get(i));
    }


    @Override
    public int getItemCount() {
        return mList.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView tv_msg;
        public MyViewHolder(View itemView) {
            super(itemView);
            tv_msg = (TextView) itemView.findViewById(R.id.tv_msg);
        }
    }
}  

四:最後Activity裡面的內容 

在Activity裡面的內容就很簡單了,也就是setAdapter了,值得提提的是除了設置Adapter,在RecyclerView裡面有一個LayoutManager的東西,這也是RecyclerView擴展性高的主要原因

代碼如下

public class MainActivity extends Activity {

    private RecyclerView recyclerView;
    private List<String> mList ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        function();

    }

    private void function() {
        mList = new ArrayList<>();
        for (int i = 0 ; i < 20 ; i++){
            mList.add("Hello"+i);
        }

        MyAdapter adapter = new MyAdapter(mList,this);
        LinearLayoutManager llm = new LinearLayoutManager(this,0,false);
        recyclerView.setLayoutManager(llm);
        recyclerView.setAdapter(adapter);
    }

    private void initView() {
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    }

}

解釋一下,首先通過findViewById找到RecyclerView

然後初始化List

然後生成Adapter實例

接下來生成LayoutManager的對象

最後設置LayoutManager和Adapter。

五:最後

解釋一下LayoutManager

RecyclerView的LayoutManager有三種,常用的有兩種,這裡接介紹下常用的兩種

第一種LinearLayoutManager

這個一看就知道線性布局管理,構造方法有三個參數,第一個上下文對象(不描述),第二個是一個int型的參數(只能是0和1)0代表橫向,1代表縱向,第三個參數Boolean表示順序還是倒序

false代表順序,true代表倒序;這種布局管理器的效果和ListView的效果是一樣的一行只能放一個item

第二種GridLayoutManager

這個一看就知道是網格布局管理器,也就是說用這種管理器可在一行放多個item,它有兩個參數;第一個上下文對象化,第二個int型表示一行放的item的個數(1:表示一行放一個item;2:表示一行放2個item)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved