深入淺出RecyclerView

RecyclerView 實(shí)現(xiàn)橫向滾動(dòng)實(shí)例:

在調(diào)用RecyclerView時(shí)首先需要在app/build.gradle當(dāng)中添加依賴庫(kù),如下所示:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support:recyclerview-v7:24.2.1'
    testCompile 'junit:junit:4.12'
}

在dependencies塊中加了
compile 'com.android.support:recyclerview-v7:24.2.1'
這句代碼,然后點(diǎn)擊 Sync Now(一定要記得同步)。

1.自定義數(shù)據(jù)類(lèi)封裝數(shù)據(jù)

package com.example.liuzeguang.recyclerviewtest;

public class Fruit {
    private String name;
    private int imageId;
    public Fruit(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public int getimageId() {
        return imageId;
    }
}

2.自定義RecyclerView的子項(xiàng)布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="100dp"
    android:layout_height="wrap_content">
    <ImageView
    android:id="@+id/fruit_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="12dp"/>
    <TextView
        android:id="@+id/fruit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="10dp"/>
</LinearLayout>

3.自定義適配器類(lèi)

package com.example.liuzeguang.recyclerviewtest;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {

    private List<Fruit> mFruitList;
    static class ViewHolder extends  RecyclerView.ViewHolder{
        ImageView fruitImage;
        TextView fruitName;
        public ViewHolder(View itemView) {
            super(itemView);
            fruitImage=(ImageView)itemView.findViewById(R.id.fruit_image);
            fruitName=(TextView)itemView.findViewById(R.id.fruit_name);
        }
    }

    public FruitAdapter(List<Fruit> fruitList) {
        this.mFruitList = fruitList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,
                parent,false);
        ViewHolder holder=new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Fruit fruit=mFruitList.get(position);
        holder.fruitImage.setImageResource(fruit.getimageId());
        holder.fruitName.setText(fruit.getName());
    }

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

這里我們首先定義了一個(gè)內(nèi)部類(lèi)ViewHotder, ViewHolder要繼承自RecyclerView.ViewHolder。然后ViewHolder的構(gòu)造函數(shù)中要傳入一個(gè)View參數(shù),這個(gè)參數(shù)通常就是RecyclerView子項(xiàng)的最外層布局,那么我們就可以通過(guò)findViewById()方法來(lái)獲取到布局中的ImageView和TextView的實(shí)例了。
接著往下看,F(xiàn)ruitAdapter中也有一個(gè)構(gòu)造函數(shù),這個(gè)方法用于把要展示的數(shù)據(jù)源傳進(jìn)來(lái),并賦值給一個(gè)全局變量mFruitList,我們后續(xù)的操作都將在這個(gè)數(shù)據(jù)源的基礎(chǔ)上進(jìn)行。
繼續(xù)往下看,由于FruitAdapter是繼承自RecycterView.Adapter的,那么就必須重寫(xiě)onCreateViewHotder()、onBindViewHotder()和getItemCount()這3個(gè)方法。onCreateViewHotder()方法是用于創(chuàng)建ViewHolder實(shí)例的,我們?cè)谶@個(gè)方法中將fruit_ item布局加載
進(jìn)來(lái),然后創(chuàng)建一個(gè)ViewHolder實(shí)例,并把加載出來(lái)的布局傳人到構(gòu)造函數(shù)當(dāng)中,最后將ViewHolder的實(shí)例返回。onBindViewHotder()方法是用于對(duì)RecyclerView子項(xiàng)的數(shù)據(jù)進(jìn)行賦值的,會(huì)在每個(gè)子項(xiàng)被滾動(dòng)到屏幕內(nèi)的時(shí)候執(zhí)行,這里我們通過(guò)position參數(shù)得到當(dāng)前項(xiàng)的Fruit
實(shí)例,然后再將數(shù)據(jù)設(shè)置到ViewHotder的ImageView和TextView當(dāng)中即可。getItemCount()方法就非常簡(jiǎn)單了,它用于告訴RecyclerView一共有多少子項(xiàng),直接返回?cái)?shù)據(jù)源的長(zhǎng)度就可以了。

4.在主程序文件中為RecyclerView設(shè)置適配器

package com.example.liuzeguang.recyclerviewtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private List<Fruit> fruitList=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFruits();
        RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);
        FruitAdapter adapter=new FruitAdapter(fruitList);
        recyclerView.setAdapter(adapter);

    }
    private void initFruits(){
        for(int i=0;i<10;i++) {
            Fruit apple = new Fruit("蘋(píng)果", R.drawable.apple);
            fruitList.add(apple);
            Fruit caomei = new Fruit("草莓", R.drawable.caomei);
            fruitList.add(caomei);
            Fruit migua = new Fruit("蜜瓜", R.drawable.migua);
            fruitList.add(migua);
            Fruit orange = new Fruit("橘子", R.drawable.orange);
            fruitList.add(orange);
            Fruit putao = new Fruit("葡萄", R.drawable.putao);
            fruitList.add(putao);
            Fruit qiyiguo = new Fruit("奇異果", R.drawable.qiyiguo);
            fruitList.add(qiyiguo);
        }
    }

}

這里使用了一個(gè)同樣的initFruits()方法,用于初始化所有的水果數(shù)據(jù)。接著在onCreate()方法中我們先獲取到RecyclerView的實(shí)例,然后創(chuàng)建了一個(gè)LinearLayoutManager對(duì)象,并將它設(shè)置到RecyclerView當(dāng)中。
LayoutManager用于指定RecyclerView的布局方式,這里使用的LinearLayoutManager是線性布局的意思,可以實(shí)現(xiàn)和ListView類(lèi)似的效果,調(diào)用LinearLayoutManager的setOrientation()方法來(lái)設(shè)置布局的排列方向,默認(rèn)是縱向排列的,我們傳人LinearLayoutManager.HORIZONTAL表示讓布局橫行排列,這樣RecyclerView就可以橫向滾動(dòng)了。
接下來(lái)我們創(chuàng)建了FruitAdapter的實(shí)例,并將水果數(shù)據(jù)傳人到FruitAdapter的構(gòu)造函數(shù)中,最后調(diào)用RecyclerView的setAdapter()方法來(lái)完成適配器設(shè)置,這樣RecyclerView和數(shù)據(jù)之間的關(guān)聯(lián)就建立完成了。
Okay!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容