Как создать пользовательскую привязку данных в Android? (android studio)

Я хочу реализовать пользовательские функции для загрузки изображения из ImageView такой app:imageUrl="@{status.imageUrl}" в приведенном ниже коде:

 <?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">

      <data>
        <variable
          name="status"
          type="com.databinding.data.Status" />

      </data>

      <RelativeLayout
        android:id="@+id/status_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
          android:id="@+id/status_avatar"
          android:layout_width="64dp"
          android:layout_height="64dp"
          android:layout_alignParentLeft="true"
          android:layout_alignParentStart="true"
          android:layout_alignParentTop="true"
          android:contentDescription="@null"
          app:imageUrl="@{status.imageUrl}"/>

      </RelativeLayout>
    </layout>

Как написать эту функцию, которая может загружать изображение автоматизировать из @{status.imageUrl} ? Используйте эту библиотеку com.android.databinding.

2 ответов


для этой работы вам нужно lib, как Android databinding lib.
В этой библиотеке сначала добавьте ниже скрипты в build.gradle о проекте:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'com.android.databinding:dataBinder:1.0-rc4'
    }
}

и добавьте эти коды в начало build.gradle из файла модуля:

apply plugin: 'com.android.databinding'

и создайте свой класс, например:class BindingCustom и пишем этот код:

public class BindingCustom {

    @BindingAdapter({"imageUrl"})
    public static void loadImage(final ImageView view, String url) {

        Picasso.with(view.getContext()).load(url).into(view);

    }
}

на BindingCustom класса loadImage метод для загрузки изображения с URL-адреса вашим заинтересованным способом, но я использую Пикассо библиотека, потому что это общий lib для этой работы, и вы можете изменить его на свои коды.

это полезная ссылка для получения дополнительной информации


ниже-это то, что я предпочитаю:

сначала сделайте пользовательский вид расширенной формы класса

import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.ImageView;

public class MyImageView extends ImageView {
    public MyImageView(Context context) {
        super(context);
        downloader(null);
    }

    public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        downloader(attrs);
    }

    public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        downloader(attrs);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public MyImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
         downloader(attrs);
    }

    private void downloder(AttributeSet attr){
    // TAKE THE LINK AND DOWNLOAD IMAGE HERE
    }
}

второй объявить styleable в папке res

<declare-styleable name="MyImageView">
    <attr name="imageUrl" format="string"/>
</declare-styleable>

наконец-то позволяет сделать нашу функцию загрузчика

private void downloader(AttributeSet attrs) {
    if (attrs!=null) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MyImageView);
        String url = a.getString(R.styleable.MyImageView_imageUrl);
        // First check whether we have such a property then
        // DOWNLOAD IT WITH ANY LIBRARY YOU LIKE
        // in this case i used IMAGE LOADER
        if(url!=null)
            ImageLoader.getInstance().displayImage(url,this);
    }
}

теперь вы можете легко добавить ссылку в свой xml

 <com.raianraika.example.MyImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:imageUrl="www.google.com"/>