RecyclerView的使用(基于Data binding)

RecyclerView自帶滑動效果,可以實現(xiàn)橫向也可縱向禽炬,這點與listview不同俏拱。默認情況是縱向的,如果需要使用橫向处坪,需要通過setLayoutManager來進行設(shè)置。

這篇文章記錄了使用data binding來實現(xiàn)一個簡單的RecyclerView的過程架专,其中包括兩個布局文件要使用data binding同窘,一個是包含RecyclerView的Activity的布局,另外一個是用于承載RecyclerView item的布局文件部脚。

下面看看使用RecyclerView的關(guān)鍵步驟:

  1. Activity布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <Button
            android:id="@+id/btn_trigger"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="刷新列表"/>
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/view_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
</layout>
  1. RecyclerView 布局
    這個布局文件用于定義每條View需要顯示的UI元素想邦,這個demo顯示的View從左到右要顯示一個序號(TextView), 一個品牌名(TextView)
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="vm"
            type="com.mike.androidtips.recyclerViewDatabinding.DeviceModel" />
    </data>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="@{vm.rank}"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="40dp"
            android:text="@{vm.brand}"
            />
    </LinearLayout>
</layout>
  1. 定義數(shù)據(jù)實體Model
package com.mike.androidtips.recyclerViewDatabinding;
import androidx.databinding.ObservableField;
public class DeviceModel {
    public ObservableField<String> rank = new ObservableField();
    public ObservableField<String> brand = new ObservableField<>();
    public DeviceModel(DataEntity dataEntity) {
        this.rank.set(dataEntity.getRank());
        this.brand.set(dataEntity.getBrand());
    }
    public void setData(DataEntity dataEntity) {
        this.rank.set(dataEntity.getRank());
        this.brand.set(dataEntity.getBrand());
    }
}

DataEntity

package com.mike.androidtips.recyclerViewDatabinding;

public class DataEntity {
    String rank;
    String brand;
    public DataEntity(String rank, String brand) {
        this.rank = rank;
        this.brand = brand;
    }
    @Override
    public String toString() {
        return "DataEntity{" +
                "rank='" + rank + '\'' +
                ", brand='" + brand + '\'' +
                '}';
    }
    public String getBrand() {
        return brand;
    }
    public String getRank() {
        return rank;
    }
}
  1. 自定義一個RecyclerView的adapter,繼承自RecyclerView.Adapter<RecyclerView.ViewHolder>并復(fù)寫其關(guān)鍵方法委刘,自定義的adapter里面需要去自定義一個ViewHolder丧没,看下面代碼:
package com.mike.androidtips.recyclerViewDatabinding;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.mike.androidtips.R;
import com.mike.androidtips.databinding.RecyclerviewItemsBinding;

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

public class RecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private final String TAG = RecycleViewAdapter.class.getSimpleName();
    List<DataEntity> dataEntities = new ArrayList<>();
    public void setDataEntities(List<DataEntity> entities) {
        dataEntities = entities;
    }

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

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        MyViewHolder myViewHolder = (MyViewHolder) holder;
        Log.d(TAG, "position = " + position + " , content: " + dataEntities.get(position));
        myViewHolder.binding.setVm(new DeviceModel(dataEntities.get(position)));
    }

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

    private class MyViewHolder extends RecyclerView.ViewHolder {
        public RecyclerviewItemsBinding binding;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            binding = RecyclerviewItemsBinding.bind(itemView);
        }
    }
}

  1. Activity里面的操作步驟:
    5.1 給RecyclerView 設(shè)置setLayoutManager
    5.2 實例化一個自定義adapter對象
    5.3 給adapter賦初始list
    5.4 把adapter設(shè)置給RecyclerView
package com.mike.androidtips.recyclerViewDatabinding;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.mike.androidtips.R;
import com.mike.androidtips.databinding.ActivityRecyclerDatabindingBinding;
import com.mike.androidtips.databinding.ActivityTestDatabindingBinding;
import java.util.ArrayList;
import java.util.List;

public class RecyclerViewDataBindingActivity extends Activity {
    private final String TAG = RecyclerViewDataBindingActivity.class.getSimpleName();

    private RecycleViewAdapter adapter;
    ActivityRecyclerDatabindingBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_recycler_databinding);
        binding.viewRecyclerview.setLayoutManager(new LinearLayoutManager(this)); //默認是vertical
        //比如制作一個水平方向的水果列表,圖標名字上下排列
        //binding.viewRecyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
        adapter = new RecycleViewAdapter();
        List<DataEntity> list = new ArrayList<>();
        DataEntity dataEntity = new DataEntity("1", "Apple");
        DataEntity dataEntity1 = new DataEntity("2", "Samsung");
        DataEntity dataEntity2 = new DataEntity("3", "OPPO");
        list.add(dataEntity);
        list.add(dataEntity1);
        list.add(dataEntity2);
        adapter.setDataEntities(list);
        binding.viewRecyclerview.setAdapter(adapter);
        initUI();
    }

    private void initUI() {
        binding.btnTrigger.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<DataEntity> list = new ArrayList<>();
                DataEntity dataEntity = new DataEntity("1", "Samsung");
                DataEntity dataEntity1 = new DataEntity("2", "chuanyin");
                DataEntity dataEntity2 = new DataEntity("3", "chuizi");
                DataEntity dataEntity3 = new DataEntity("4", "vivo");
                list.add(dataEntity);
                list.add(dataEntity1);
                list.add(dataEntity2);
                list.add(dataEntity3);
                adapter.setDataEntities(list);
                adapter.notifyDataSetChanged();
            }
        });
    }
}

  1. 運行結(jié)果


    result.png

注:最初在調(diào)試時候遇到了問題:無論如何修改锡移,整個list顯示的都是最后一組數(shù)據(jù)
原因:DeviceModel里的數(shù)據(jù)被定義成了static, 干掉static即解決了問題

    public static ObservableField<String> rank = new ObservableField();
    public static ObservableField<String> brand = new ObservableField<>();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呕童,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子淆珊,更是在濱河造成了極大的恐慌夺饲,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件施符,死亡現(xiàn)場離奇詭異往声,居然都是意外死亡,警方通過查閱死者的電腦和手機戳吝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門浩销,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骨坑,你說我怎么就攤上這事撼嗓〖聿桑” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵且警,是天一觀的道長粉捻。 經(jīng)常有香客問我,道長斑芜,這世上最難降的妖魔是什么肩刃? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮杏头,結(jié)果婚禮上盈包,老公的妹妹穿的比我還像新娘。我一直安慰自己醇王,他們只是感情好呢燥,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寓娩,像睡著了一般叛氨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棘伴,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天寞埠,我揣著相機與錄音,去河邊找鬼焊夸。 笑死仁连,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阱穗。 我是一名探鬼主播饭冬,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颇象!你這毒婦竟也來了伍伤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤遣钳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后麦乞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕴茴,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年姐直,在試婚紗的時候發(fā)現(xiàn)自己被綠了倦淀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡声畏,死狀恐怖撞叽,靈堂內(nèi)的尸體忽然破棺而出姻成,到底是詐尸還是另有隱情,我是刑警寧澤愿棋,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布科展,位于F島的核電站,受9級特大地震影響糠雨,放射性物質(zhì)發(fā)生泄漏才睹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一甘邀、第九天 我趴在偏房一處隱蔽的房頂上張望琅攘。 院中可真熱鬧,春花似錦松邪、人聲如沸坞琴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剧辐。三九已至,卻和暖如春锋八,著一層夾襖步出監(jiān)牢的瞬間浙于,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工挟纱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羞酗,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓紊服,卻偏偏與公主長得像檀轨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欺嗤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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