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!