android - 如何通过集成数据绑定(bind) android 来更改我现有的代码

标签 android kotlin data-binding android-databinding android-livedata

我有一个现有代码,我通过改造将其与实时数据集成。

现在,如果我想集成数据绑定(bind),要使代码看起来更完美,需要做哪些更改?

这是我的代码。

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        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"
        android:layout_width="match_parent"
        android:background="#000000"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <LinearLayout
            android:id="@+id/linearLayout2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="vertical"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">


        <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="Android Versions"
                android:textColor="#ffffff"
                android:textSize="20sp" />
        <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
    </LinearLayout>

 items.xml:


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:background="#445566"
        android:layout_margin="5dp"
        android:layout_height="wrap_content">

    <TextView
            android:id="@+id/tvFname"
            android:padding="5dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top|start"
            android:layout_marginTop="8dp"
            android:textColor="#ffffff"
            android:layout_weight="1"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>

    <TextView
            android:id="@+id/tvLname"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center|start"
            android:padding="5dp"
            android:layout_marginTop="10dp"
            android:layout_weight="1"
            android:ellipsize="end"
            android:textColor="#ffffff"
            android:maxLines="5"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tvFname"/>


</android.support.constraint.ConstraintLayout>

这是我集成的 View 模型类

class  AndroidViewModel:ViewModel() {
    private val mService = RetrofitService()

    fun getAndroidData():MutableLiveData<List<AndroidData>>?{
        return mService.loadAndroidData()
    }
}

生成的Pojo类只是一个简单的类:

 data class AndroidData (val name:String, val apiLevel:String)

服务整合:

class RetrofitService {
    val liveUserResponse:MutableLiveData<List<AndroidData>> = MutableLiveData()

    companion object Factory {
        var gson = GsonBuilder().setLenient().create()
        fun create(): ApiInterface {
            Log.e("retrofit","create")

            val retrofit = Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl("https://learn2crack-json.herokuapp.com/api/")
                .build()

            return retrofit.create(ApiInterface::class.java)
        }
    }

    fun loadAndroidData(): MutableLiveData<List<AndroidData>>? {

        Log.e("loadAndroidData","yes")

        val retrofitCall  = create().getAndroid()

        retrofitCall.enqueue(object : Callback<List<AndroidData>> {
            override fun onFailure(call: Call<List<AndroidData>>, t: Throwable?) {
                Log.e("on Failure :", "retrofit error")
            }

            override fun onResponse(call: Call<List<AndroidData>>, response: retrofit2.Response<List<AndroidData>>) {

                val list  = response.body()
                for (i in list.orEmpty()){
                    Log.e("on response 1:", i.name)

                }

                liveUserResponse.value = list

                Log.e("hasActiveObservers 1", liveUserResponse.hasActiveObservers().toString()+" check")

                Log.e("on response 2 :", liveUserResponse.toString()+" check")

            }

        })

        return liveUserResponse
    }

主要 Activity :

class MainActivity : AppCompatActivity(){

    private lateinit var linearLayoutManager: LinearLayoutManager
    override fun onCreate(savedInstanceState: Bundle?) {


        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        linearLayoutManager = LinearLayoutManager(this)
        recyclerView.setHasFixedSize(true)
        getAndroidVersion()
    }

    private fun getAndroidVersion() {
        Log.e("getAndroidVersion", "yes")

        val mAndroidViewModel = ViewModelProviders.of(this@MainActivity).get(AndroidViewModel::class.java)
        mAndroidViewModel.getAndroidData()?.observe(this, Observer<List<AndroidData>> { androidList ->

            Log.e("list", androidList?.size.toString())
            recyclerView.adapter = EmpAdapter(this@MainActivity, androidList as ArrayList<AndroidData>, object :
                ItemClickListener {
                override fun onItemClick(pos: Int, name:String) {
                    Toast.makeText(applicationContext, "item "+pos+ "clicked"+ name, Toast.LENGTH_LONG).show()
                }
            })
        })

    }

}

适配器类:

class EmpAdapter(
    var context: MainActivity,
    var mEmpList: ArrayList<AndroidData>,
    private val itemClick:ItemClickListener
) :
    RecyclerView.Adapter<EmpAdapter.EmpHolder>() {
    override fun getItemCount(): Int {
        return mEmpList.size
    }
    companion object {
        var mItemClickListener : ItemClickListener? = null
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EmpHolder {
        val view = LayoutInflater.from(context).inflate(R.layout.items, parent, false)
        return EmpHolder(view)
    }

    override fun onBindViewHolder(holder: EmpHolder, position: Int) {
        mItemClickListener = itemClick
        holder.tvFname?.text = mEmpList[position].name
        holder.tvLname?.text = mEmpList[position].apiLevel
        RxView.clicks(holder.mView).subscribe {
            mItemClickListener!!.onItemClick(position,mEmpList[position].name)
        }

    }




 class EmpHolder(view: View) : RecyclerView.ViewHolder(view) {
        val tvFname = view.tvFname
        val tvLname = view.tvLname
        val mView = view
    }
}

改造接口(interface):

interface ApiInterface {
    @GET("android")
    fun getAndroid(): Call<List<AndroidData>>
}

现在我的问题是,如果我在 xml 中集成标签和,我需要为 textview 指定哪个变量以集成以连接适配器中的 textview?如果我使用实时数据,请指导我需要更改哪些地方才能申请

最佳答案

首先,我强烈建议您使用 Retrofit Adapter,它会自动为您将响应转换为 LiveData。看这个例子

https://github.com/yasiralijaved/android-architecture-components/blob/master/component_http/src/main/java/com/yasiralijaved/android/arc/component/http/BackendService.java

其次,那里有详细的教程,肯定可以帮助您如何在 RecyclerView Adapter 中实现数据绑定(bind)。一些教程是:

  1. > https://medium.com/androiddevelopers/android-data-binding-recyclerview-db7c40d9f0e4
  2. > https://android.jlelse.eu/how-to-bind-a-list-of-items-to-a-recyclerview-with-android-data-binding-1bd08b4796b4

如果仍然不清楚,请告诉我,我会分享更多细节。

Happy coding!!

关于android - 如何通过集成数据绑定(bind) android 来更改我现有的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57175733/

相关文章:

data-binding - WinRT (Windows 8) Store 应用程序 XAML 绑定(bind)relativesource 模式 FindAncestor 丢失?

android - Adb 未在 Windows 上检测到安卓设备 - Lenovo Yoga Tablet 2

android - 导航栏后面的 Mediacontroller

java - 我如何在 Micronaut/Kotest/Hibernate 测试中出现 "obtain transaction-synchronized Session for current thread"

gradle - 将iOS/Android Groovy Gradle文件转换为Kotlin-getBinary,getProperty(+文字属性)?

WPF:如何将 ItemsControl 中的项目包装在另一个模板中?

android - 使用数据绑定(bind) onClick 表达式时未生成 fragment 的 BindingImpl 类

android - ANDAND 条件应为 'if true then false'

android - 如何在 Android 设备上使用 pjsip 以获得 G.729 编解码器功能

android - 存储库类中的协程范围