安卓開發之RecyclerView

XiomaraHand 8年前發布 | 14K 次閱讀 Android開發 移動開發 RecyclerView

來自: http://www.cnblogs.com/todaylovegoaway/p/5166970.html

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="

<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></pre>

再寫上面的代碼是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);
    }
}

}</pre>

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

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

class MyViewHolder extends RecyclerView.ViewHolder{

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

}</pre>

昨晚上面的步驟再去實現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);
    }
}

}</pre>

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

這樣這個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);
    }
}

}  </pre>

四:最后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);
}

}</pre>

解釋一下,首先通過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)

</div>

 本文由用戶 XiomaraHand 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!