1. 程式人生 > >dataBinDing 繫結receycelView, listView ,和 圖片載入

dataBinDing 繫結receycelView, listView ,和 圖片載入

在專案了xml檔案中繫結詩句資料就是在,不好的地方就死就是程式碼執行之後又出現的問題就是,不容易找到,廢話少說,下面正式介紹,。

需要在app目錄下得的buildgradle檔案中加上在android{}內部加上

dataBinding {
    enabled true
}

然後在引入依賴的檔案

compile 'com.android.support:recyclerview-v7:25.3.1'
compile "com.liangfeizc:avatarview:[email protected]"
compile 'com.github.bumptech.glide:glide:3.7.0'

其中compile "com.liangfeizc:avatarview:[email protected]

"是在網上找的自定義的原型的圖片。

2.下面介紹繫結的過程,既然是繫結那麼,在xml 檔案中首先繫結資料的來原

<variable
name="rvAdapter"
type="com.cnlive.granzon.ui.adapter.RVAdapter" />

其中name的名字隨便起只要在程式碼中關聯一直就行,我認為其實這個名字就是在程式碼中設定資料的時候保持一直比如說我在這裡是rvAdapter那麼我在設定資料的時候就會用到

fragmentChatroomBinding.setRvAdapter(new RVAdapter(getContext(), list2, R
.layout.receycel_item_view, BR.user));

上面的方法,即setRvAdapter方法設定資料,

再看設定recelView與vriable設定關聯

<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_toLeftOf="@id/people_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:adapter="@{rvAdapter}"
app:layoutManager="@{rvLayoutManager}" />

其中app:adapter就是和上面的name="rvAdapter"  設定關聯, 而 app:layoutManager就是說他的型別,是gradal 還是linear, 也是在程式碼中設定,同樣方法也是對應的

下面看實際的程式碼

先看

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    fragmentChatroomBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_chatroom, container, false);
    return fragmentChatroomBinding.getRoot();
}

在activity 和fragment中繫結xml檔案的方法不一樣,上面是fragment中的繫結的方法,

fragmentChatroomBinding.setRvLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
fragmentChatroomBinding.setRvAdapter(new RVAdapter(getContext(), list2, R.layout.receycel_item_view, BR.user));

第一個方法就是設定他的型別,第二個方法就是他的資料繫結,

第二個方法中其中R.layout.receycel_item_view是實際的每一項的xml 檔案, 後面的BR.user是每一項中的資料依賴的user

來看一下

<?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="user"
type="com.cnlive.granzon.model.User" />
    </data>    <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:orientation="horizontal">
        <com.liangfeizc.avatarview.AvatarView
android:layout_width="20dp"
android:layout_height="20dp"
app:imageUrl="@{user.icon}"
/>    </LinearLayout></layout>

其實邏輯是和上面講的一樣的重點看一下RVAdapter

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.RVHolder> {
    private Context mContext;
    private List<User> mDataList;
    private int mLayoutId;      // 條目佈局檔案ID
private int mVariableId;    // DataBinding變數ID
public RVAdapter(Context context, List<User> list, int layoutId, int variableId) {
        this.mContext = context;
        this.mDataList = list;
        this.mLayoutId = layoutId;
mVariableId = variableId;
}

    @Override
public RVHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), mLayoutId, parent, false);
RVHolder holder = new RVHolder(binding.getRoot());
holder.binding = binding;
        return holder;
}

    @Override
public void onBindViewHolder(RVHolder holder, int position) {
        holder.binding.setVariable(mVariableId, mDataList.get(position));
// 別忘記這句程式碼
holder.binding.executePendingBindings();
}

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

    class RVHolder extends RecyclerView.ViewHolder {
        ViewDataBinding binding;
RVHolder(View view) {
            super(view);
}
    }
}

只需要把程式碼複製一下就可以了,其實邏輯很簡單  先把xml 檔案繫結,後來再把資料繫結這樣就可以實現了,還有最容易忘記的程式碼

你會想圖片載入的方法呢,別急,採用註解的方式

@BindingAdapter({"imageUrl"})
public static void loadImage(ImageView imageView, String url) {
    if (url == null) {
        imageView.setImageResource(R.mipmap.ic_launcher);
} else {
        Glide.with(imageView.getContext()).load(url).error(R.mipmap.ic_launcher).into(imageView);
}
}

其中xml檔案中的imageUrl和這裡的註解的名字是一樣的。下面主要講的就是上面的方法,後續會把程式碼地址貼出來

相關推薦

dataBinDing receycelView, listView , 圖片載入

在專案了xml檔案中繫結詩句資料就是在,不好的地方就死就是程式碼執行之後又出現的問題就是,不容易找到,廢話少說,下面正式介紹,。 需要在app目錄下得的buildgradle檔案中加上在android{}內部加上 da

DataBindingRecycleryView與ListView

上一篇文章講解了databinding 的基礎用法,那麼這一篇我們來說說 databinding 的資料重新整理,以及與 RecycleryView 和ListView 的使用。 1.  我們先來說說資料重新整理是怎麼實現的。 public class Bean extends B

C# listview通過imagelist來新增圖片

public void ArrayImage(string[] ImagePath) { this.listView1.Items.Clear(); this.imageList1.Images.Clear(); for

jquery事件 bindon的區別

bind和on都是給元素繫結事件用的,其最大的區別就是事件冒泡 事件冒泡也是委託事件的原型,事件委託就是子類的事情委託給父類的去做 最直觀的區別就是on繫結比bind繫結多一個引數'childSelector' 語法 $(selector).on(event,childSelecto

vue中用computed簡單實現資料的雙向(getter setter)

vue是號稱實現了資料雙向繫結的框架,但事實上在日常開發中我們用的最多的就是 v-model 將data(vue例項中)裡面的是資料和view 相關聯,實現 data 更新,view自動重新整理的效果。但是,在移動成都上來說,這種資料雙向繫結的效果並不是特別的明顯。 今天,我用輸入框和 co

伺服器端tomcat配置,實現二級域名不同埠釋出不同專案

配置版本tomcat7與jre1.6 注意:配置是一定要注意自己使用的版本,因為不同的版本配置可能略有些不同。博主就遇到了=-= 在伺服器配置時需要開啟tomcat安裝檔案目錄下的conf資料夾下sever.xml 一、實現繫結域名 進行一下配置 首先將預設8080介面改為80介

Tomcat伺服器配置——使得伺服器相關域名不同埠釋出不同專案

配置版本tomcat9與jre1.8 在伺服器配置時需要開啟tomcat安裝檔案目錄下的conf資料夾下sever.xml 進行一下配置 一、實現用域名開啟固定專案(預設開啟index.jsp) 將8080埠變成80埠 將localhost變成你的域名。本次配置域名為abc

jQuery on() 方法 為選定已存在元素未來元素標準事件自定義事件

很有必要說說jQuery的on方法,這個方法存在大乾坤大奧祕,主要注意兩點: 1、為已存在元素和未來元素(動態新增元素)繫結處理函式。 2、自定義一個非標準的事件並繫結處理函式。 定義和用法 on() 方法在被選元素及子元素上新增一個或多個事件處理程式。 自 jQuery 版本 1.7 起,on()

Vue屬性v-bind:雙向資料v-model

<body> <!--屬性繫結v-bind: 可以直接省略為 :--> <!--一旦使用模版指令 等號之後的就是一個js表示式,所以裡面可以使用很多js表示式--> <div id="root"> <div v-b

關於jQuery事件onbind的區別詳解

如題,jQuery兩種繫結事件,舉例說明: //對於ul_li的繫結方法 //方法一: $("ul li").bind("click",function(){console.log($(this))}); //方法二: $("ul li").on("click",fun

Rust 未可變引用 可變引用的區別

Rust 繫結可變引用 和可變繫結的區別 在Rust Documents Api 中 我們經常會看到如下的寫法 //繫結可變引用 let f = &mut String::from("what something"); //可變繫結 let m

微信小程式 動態 style 樣式 class

<view class="changeImageView" style="display:{{displayPhoto}}" > <view class="operbtn">測試</view> </view> <vi

中文輸入法觸發input事件 js事件:addEventListeneron的區別 select下拉框用empty()方法 清空option

中文輸入法觸發input事件 compositionstart 當瀏覽器有非直接的文字輸入時, compositionstart事件觸發. compositionend 當瀏覽器是直接的文字輸入時, compositionend事件觸發 解決方法: 這裡還有一個問題: 在有些瀏

bindService:本地服務遠端服務示例

繫結本地服務 AndroidManifest.xml中宣告服務: <service android:name=".TestLocalService"> <intent-filter> <

MyBatis 介面 session.getMapper( ) 多引數傳遞

MyBatis 介面繫結方案 session.getMapper( ) 作用:建立一個介面後,由 mybatis 把 mapper.xml 生成介面的實現類,通過呼叫介面物件就可以獲取 mapper.xml 中編寫的 sql. mybatis 和

關於winForm介面控制元件圖片載入時出現閃屏的問題

  最近在做一個專案,winform介面在載入自定義控制元件時,圖片出現閃屏。後來在網上找了很久的資料,說的最多的是一下幾個解決方案: 1.利用winForm的一個屬性,DoubleBuffer 設定

【Vue中的坑】vue專案中動態src不顯示圖片解決方法

  v-for繫結src的資料如下: data() { return { img_src:"../../assets/images/mirror-service.png" } }   渲染之後,發現圖片不顯示,上網查詢之後發現是應為

筆記(二),VUE V-MODEL 雙向,以及 watch computed的區別

vue官網上的v-model指令的介紹是   v-model 預期:隨表單控制元件型別不同而不同。 限制: <input> <select> <textarea> components

JavaScript事件的與取消事件監聽

                很多情況下,比如我們想對一個文字框或者按鈕進行事件繫結的時候,一般直接在他上面寫上什麼onclic

vue資料雙向的原理vue-router路由的實現原理

vue實現雙向資料繫結的原理就是利用了 Object.defineProperty() 這個方法重新定義了物件獲取屬性值(get)和設定屬性值(set)的操作來實現的。 在MDN上對該方法的說明是:Object.defineProperty() 方法會直接在一個物件上定義一