Recyclerview使用體驗(一)

  • 僅作為自己在使用recyclerview過程中一點點記錄,
  • 使用Recyclerview已經(jīng)有一定時間插勤,項目中也用了很久沽瘦,總覺得該親自整理一下革骨,也算是自己回顧一下Recyclerview的知識,然后嘗試去深層次的了解Recyclerview析恋,只會用良哲,不了解,也不算是會用助隧;
  • 如果你想嘗試Recyclerview筑凫,正好又看到這個文章,嗯哼0.0并村,那你就好好看看吧巍实。
  • 廢話不多說,直接開整

首先當(dāng)然是添加依賴橘霎,根據(jù)當(dāng)前sdk版本蔫浆,選擇合適的依賴,Recyclerview是V7包提供的姐叁,所以呢瓦盛?
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:recyclerview-v7:24.0.0'
第一個不必說,第二個就是我們需要的導(dǎo)入的包了外潜,rebuild一下原环,看看是否導(dǎo)入成功,只要根據(jù)自己使用的sdk版本处窥,一般是沒有意外的嘱吗,如果有了


很明顯是你導(dǎo)入錯了。

  • 導(dǎo)入成功滔驾,接下來就是布局里使用了

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout            
    xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"    
        android:layout_width="match_parent"    
        android:layout_height="match_parent"    
        android:orientation="vertical">    
        <android.support.v4.widget.SwipeRefreshLayout        
            android:id="@+id/swipeRefresh"        
            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.v4.widget.SwipeRefreshLayout>
     </LinearLayout>
    
  • 布局很簡單谒麦,SwipeRefreshLayout包裹Recyclerview,實現(xiàn)下拉刷新
    回到代碼中

public class MainActivity extends AppCompatActivity {
@InjectView(R.id.recyclerview)
RecyclerView recyclerview;
@InjectView(R.id.swipeRefresh)
SwipeRefreshLayout swipeRefresh;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
initData();
}
}

Recyclerview和SwipeRefreshLayout初始化完成哆致,開始加載數(shù)據(jù)實現(xiàn)Recyclerview的多種實現(xiàn)布局绕德;


![先請求到數(shù)據(jù).png](http://upload-images.jianshu.io/upload_images/2789715-d9ac349d9a7c5c9e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

有了數(shù)據(jù)之后,和ListView一樣摊阀,需要設(shè)置適配器耻蛇,但是Recyclerview得適配器和ListView適配器,不完全一樣胞此;假設(shè)Recyclerview適配器定義為Adapter
      
    public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    }
    @Override
    public int getItemCount() {
        return 0;
    }
    }

我們真正要實現(xiàn)的是重寫一個ViewHolder臣咖,繼承 Recyclerview.ViewHolder;

      public class ItemHolder extends RecyclerView.ViewHolder {
        public ItemHolder(View itemView) {
            super(itemView);
        }
    }

設(shè)置Adapter的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:paddingLeft="10dp"
android:paddingTop="10dp">

<ImageView
    android:id="@+id/imageView"
    android:layout_width="40dp"
    android:layout_height="40dp" />

<TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical"
    android:layout_marginLeft="15dp"
    android:drawableBottom="@drawable/line"
    android:ellipsize="end"
    android:gravity="center_vertical"
    android:text="123"
    android:textColor="@color/colorAccent"
    android:textSize="16sp" />

</LinearLayout>

</LinearLayout>

回到Adapter

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

private Context context;
private ArrayList<String> datas;

public Adapter(Context context, ArrayList<String> datas) {
    this.context = context;
    this.datas = datas;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ItemHolder(LayoutInflater.from(context).inflate(R.layout.item_adapter, null));
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

}

@Override
public int getItemCount() {
    return datas.size() == 0 ? 0 : datas.size();
}

public class ItemHolder extends RecyclerView.ViewHolder {
    private ImageView imageView;
    private TextView textView;

    public ItemHolder(View itemView) {
        super(itemView);
        this.imageView = (ImageView) itemView.findViewById(R.id.imageView);
        this.textView = (TextView) itemView.findViewById(R.id.textView);
    }
}

}

最后數(shù)據(jù)綁定

/**

  • Creation time : 2016/11/22 21:01
  • Fix time : 2016/11/22 21:01
    */

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

private Context context;
private List<String> datas;

public Adapter(Context context, List<String> datas) {
    this.context = context;
    this.datas = datas;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ItemHolder(LayoutInflater.from(context).inflate(R.layout.item_adapter, null));
}

//綁定數(shù)據(jù)
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
bindViewHolder((ItemHolder) holder);

}

private void bindViewHolder(ItemHolder holder) {
    for (int i = 0; i < this.datas.size() - 1; i++) {
        holder.textView.setText(datas.get(i));
        holder.imageView.setBackgroundResource(R.drawable.musiclogo144);
    }
}


@Override
public int getItemCount() {
    return datas.size() == 0 ? 0 : datas.size();
}

public class ItemHolder extends RecyclerView.ViewHolder {
    private ImageView imageView;
    private TextView textView;

    public ItemHolder(View itemView) {
        super(itemView);
        this.imageView = (ImageView) itemView.findViewById(R.id.imageView);
        this.textView = (TextView) itemView.findViewById(R.id.textView);
    }
}

}

回到加載數(shù)據(jù)部分
/**
 * 請求數(shù)據(jù)
 */
private void initData() {
    //假設(shè)聯(lián)網(wǎng)請求數(shù)據(jù)N條,這里我就用本地數(shù)據(jù)
    data = null;
    for (int i = 0; i < 40; i++) {
        data.add(i, i + ". 成功請求數(shù)據(jù)");
    }
    adapter = new Adapter(MainActivity.this, data);
    recyclerview.setAdapter(adapter);
}
編譯運行

但是什么都沒有漱牵,因為我們沒有設(shè)置LayoutManager夺蛇,Recyclerview需要設(shè)置LayoutManager,才能顯示酣胀;

public class MainActivity extends AppCompatActivity {

@InjectView(R.id.recyclerview)
RecyclerView recyclerview;
@InjectView(R.id.swipeRefresh)
SwipeRefreshLayout swipeRefresh;
private static final int GET = 1;
private LinearLayoutManager linearLayoutManager;  
private GridLayoutManager gridLayoutManager;
private StaggeredGridLayoutManager staggeredGridLayoutManager;
private List<String> data;
private RecyclerView.LayoutManager layoutmanager;
private Adapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.inject(this);
       linearLayoutManager = new LinearLayoutManager(MainActivity.this);  //常見縱向布局

// linearLayoutManager = new LinearLayoutManager(MainActivity.this,LinearLayoutManager.HORIZONTAL,true); //水平方向刁赦,最后一個參數(shù)是否逆向
gridLayoutManager = new GridLayoutManager(MainActivity.this, 2); //類似GridView的格式愿卸,第二個參數(shù)為行的item數(shù)量,同理截型,也有水平方向的GridLayoutManager趴荸;
staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); //瀑布流,第一個為每行item數(shù)量
layoutmanager = linearLayoutManager; //默認(rèn)為縱向的Recyclerview宦焦;
initData();
}

@Override
public boolean onCreateOptionsMenu(Menu item) {
    getMenuInflater().inflate(R.menu.main_menu, item);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.linearlayout:
            layoutmanager = linearLayoutManager;
            initData();
            break;
        case R.id.gridlayout:
            layoutmanager = gridLayoutManager;
            break;
        case R.id.staggeredgridlayout:
            layoutmanager = staggeredGridLayoutManager;
            initData();
            break;
        default:
            layoutmanager = linearLayoutManager;
            initData();
            break;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * 請求數(shù)據(jù)
 */
private void initData() {
    //假設(shè)聯(lián)網(wǎng)請求數(shù)據(jù)N條,這里我就用本地數(shù)據(jù)
    data = new ArrayList<>();
    for (int i = 0; i < 40; i++) {
        data.add(i + ". 成功請求數(shù)據(jù)");
    }
    recyclerview.setLayoutManager(layoutmanager);
    adapter = new Adapter(MainActivity.this, data);
    recyclerview.setHasFixedSize(true);
    recyclerview.setAdapter(adapter);
}

}

默認(rèn)的LayoutManager

![LayoutManager==LinearLayoutManager.png](http://upload-images.jianshu.io/upload_images/2789715-3701f5ba45cdff7d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
那么切換LayoutManager為GridLayoutManager发钝,效果會是什么樣呢

![LayoutManager為GridLayoutManager.png](http://upload-images.jianshu.io/upload_images/2789715-140c3fc0ad08fe70.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

最后,切換到瀑布流


![LayoutManager為StaggeredGridLayoutManager.png](http://upload-images.jianshu.io/upload_images/2789715-0cfd753ab973a980.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

什么效果都沒有波闹,這是為什么呢酝豪,因為,設(shè)置瀑布流精堕,我們需要對item的間隙進行設(shè)置孵淘,不然沒有效果
首先自定義ItemDecoration

public class ItemDecoration extends RecyclerView.ItemDecoration {

private int space;

public ItemDecoration(int space) {
    this.space = space;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    outRect.left = space;
    outRect.right = space;
    outRect.bottom = space;
    if (parent.getChildAdapterPosition(view) == 0) {
        outRect.top = space;
    }
}

}

設(shè)置間隙

 * 請求數(shù)據(jù)
 */
private void initData() {
    //假設(shè)聯(lián)網(wǎng)請求數(shù)據(jù)N條,這里我就用本地數(shù)據(jù)
    data = new ArrayList<>();
    for (int i = 0; i < 40; i++) {
        data.add(i + ". 成功請求數(shù)據(jù)");
    }
    recyclerview.setLayoutManager(layoutmanager);
    if(layoutmanager.equals(staggeredGridLayoutManager)) {   //針對瀑布流,設(shè)置間隙
        recyclerview.addItemDecoration(new ItemDecoration(15));
    }
    adapter = new Adapter(MainActivity.this, data);
    recyclerview.setHasFixedSize(true);
    recyclerview.setAdapter(adapter);
}
重新編譯運行歹篓,搞定

![瀑布流效果.png](http://upload-images.jianshu.io/upload_images/2789715-18bd62a8639f13fc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
這算是Recyclerview的簡單使用瘫证,實現(xiàn)三種模式,已經(jīng)搞定庄撮,還有很多細(xì)節(jié)背捌,留到下一篇,仔細(xì)講解洞斯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毡庆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子烙如,更是在濱河造成了極大的恐慌么抗,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亚铁,死亡現(xiàn)場離奇詭異蝇刀,居然都是意外死亡,警方通過查閱死者的電腦和手機刀闷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門熊泵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仰迁,“玉大人甸昏,你說我怎么就攤上這事⌒煨恚” “怎么了施蜜?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雌隅。 經(jīng)常有香客問我翻默,道長缸沃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任修械,我火速辦了婚禮趾牧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肯污。我一直安慰自己翘单,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布蹦渣。 她就那樣靜靜地躺著哄芜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柬唯。 梳的紋絲不亂的頭發(fā)上认臊,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音锄奢,去河邊找鬼失晴。 笑死,一個胖子當(dāng)著我的面吹牛拘央,可吹牛的內(nèi)容都是我干的师坎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赘来?” 一聲冷哼從身側(cè)響起实蓬,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痊硕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡盟萨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了了讨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捻激。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖前计,靈堂內(nèi)的尸體忽然破棺而出胞谭,到底是詐尸還是另有隱情,我是刑警寧澤男杈,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布丈屹,位于F島的核電站,受9級特大地震影響伶棒,放射性物質(zhì)發(fā)生泄漏旺垒。R本人自食惡果不足惜彩库,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望先蒋。 院中可真熱鬧骇钦,春花似錦、人聲如沸竞漾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畴蹭。三九已至坦仍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叨襟,已是汗流浹背繁扎。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糊闽,地道東北人梳玫。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像右犹,于是被迫代替她去往敵國和親提澎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評論 25 707
  • 這篇文章分三個部分念链,簡單跟大家講一下 RecyclerView 的常用方法與奇葩用法盼忌;工作原理與ListView比...
    LucasAdam閱讀 4,379評論 0 27
  • 本來想寫到簡書上的谦纱,不知為什么簡書登不了,可能崩了吧君编。然后到blogbus寫完跨嘉,發(fā)現(xiàn)竟然又雙叒叕要審核,有點煩吃嘿,再...
    lxt閱讀 183評論 1 0
  • 最近一個月寫了一些文章寺庄,很多人在咨詢怎么內(nèi)修艾蓝?怎么提升能量力崇?怎么吸收能量斗塘?其實若真有興趣,都可以多看歷史文章亮靴。今天...
    百家載閱讀 1,562評論 0 6
  • 當(dāng)一切入睡 當(dāng)一切入睡馍盟,我常興奮地獨醒, 仰望繁星密布熠熠燃燒的穹頂茧吊, 我靜坐著傾聽夜聲的和諧贞岭。 時辰的鼓翼沒打斷...
    NikkiLiu閱讀 275評論 0 0