Android進階---android databinding 使用

1.配置,

  • 在 module裏面添加
android {   
     ....   
     dataBinding {        
       enabled = true   
     }
}

2.基礎使用

  • 創建簡單的model實體類
public class SwordMan{
    private String name;
    private String level;

    public SwordMan(String name, String level) {
        this.name = name;
        this.level = level;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;

    }
}
  • 編寫佈局文件:需要根佈局變成layout
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="swordsman"
            type="com.light.testdatabinding.SwordMan" />
    </data>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@={swordsman.name}" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{swordsman.leval}" />
    </LinearLayout>

</layout>
  • activty裏面綁定使用
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
SwordMan swordMan=new SwordMan("你好","點擊我");
binding.setSwordsman(swordMan);
  • 補充

    以上就是databinding基礎使用,我們給實體類賦值以後textview的text會自動改變。ActivityMainBinding是根據綁定的佈局名稱自動生成的。它的作用就相當於佈局一個替代類

3.知識講解,詳細介紹閱讀API文檔

  • 根佈局layout替代,裏面的佈局不變
  • data節點用來關聯定義數據,裏面的variable節點(一個節點相當於一個實體類):name屬性表示變量的名作,type表示變量的類型。import節點導入一個類的包,他的使用和type類似。如下。
  <data>
        <import type="java.util.Date"/>

        <variable
            name="swordsman"
            type="com.light.testdatabinding.SwordMan" />
        <variable
            name="time"
            type="Date" />
    </data>
  • 當我們綁定一個佈局以後,就可以通過對象直接獲取id:test就是佈局裏面textview的id
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
binding.test.setText("測試");
  • 事件處理:直接通過binding對象操作id
 binding.btnTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                swordMan.setName("重置");
                startActivity(new Intent(MainActivity.this,Main2Activity.class));
            }
        });

4.recyclerview使用databinding

  • recyclerviewr佈局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </android.support.v7.widget.RecyclerView>
    </LinearLayout>

</layout>
  • recyclerviewr item佈局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <import type="com.light.testdatabinding.OBSwordMan" />

        <variable
            name="swordman"
            type="OBSwordMan" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{swordman.name}" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{swordman.level}" />
    </LinearLayout>

</layout>
  • 實體類

public class OBSwordMan extends BaseObservable {
    private String name;
    private String level;

    public OBSwordMan(String name, String level) {
        this.name = name;
        this.level = level;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;

    }
}
  • recyclerview Adapter創建,RvItemBinding類是更具佈局名生成的類

public class SwordmanAdapter extends RecyclerView.Adapter<SwordmanAdapter.SwordmamViewHoler> {
    private List<OBSwordMan> manList;

    public SwordmanAdapter(List<OBSwordMan> manList) {
        this.manList = manList;
    }

    @Override
    public SwordmamViewHoler onCreateViewHolder(ViewGroup parent, int viewType) {
        RvItemBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.rv_item, parent, false);
        return new SwordmamViewHoler(binding);
    }

    @Override
    public void onBindViewHolder(SwordmamViewHoler holder, int position) {
        OBSwordMan swordMan = manList.get(position);
        holder.getBinding().setSwordman(swordMan);

    }

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

    public class SwordmamViewHoler extends RecyclerView.ViewHolder {
        RvItemBinding binding;

        public SwordmamViewHoler(ViewDataBinding binding) {
            super(binding.getRoot());
            this.binding = (RvItemBinding) binding;
        }

        public RvItemBinding getBinding() {
            return binding;
        }
    }
}
  • activity裏面實現
public class Main2Activity extends AppCompatActivity {
    private ActivityMain2Binding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main2);
        initRecycler();

    }

    private void initRecycler() {
        LinearLayoutManager manager = new LinearLayoutManager(this);
        binding.recycler.setLayoutManager(manager);
        SwordmanAdapter adapter = new SwordmanAdapter(getList());
        binding.recycler.setAdapter(adapter);
    }

    public List<OBSwordMan> getList() {
        List<OBSwordMan> list = new ArrayList<>();
        OBSwordMan obSwordMan = new OBSwordMan("張三", "生命如此短暫");
        OBSwordMan obSwordMan2 = new OBSwordMan("張三1", "生命如此短暫");
        OBSwordMan obSwordMan3 = new OBSwordMan("張三2", "生命如此短暫");
        OBSwordMan obSwordMan4 = new OBSwordMan("張三3", "生命如此短暫");
        OBSwordMan obSwordMan5 = new OBSwordMan("張三4", "生命如此短暫");
        list.add(obSwordMan);
        list.add(obSwordMan2);
        list.add(obSwordMan3);
        list.add(obSwordMan4);
        list.add(obSwordMan5);
        return list;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章