Универсальный адаптер с привязкой к данным - PullRequest
0 голосов
/ 08 марта 2019

Я создаю универсальный адаптер для любого типа привязки ..

class DataBindingBaseAdapter<T> : RecyclerView.Adapter<DataBindingViewHolder<T>> {

    private var listItems: List<T>
    private var layoutID: Int

    constructor(layoutID: Int,listItems: List<T>) {
        this.listItems = listItems
        this.layoutID = layoutID
    }

    override fun onCreateViewHolder(parent: ViewGroup, p1: Int): DataBindingViewHolder<T> {
        val binding = DataBindingUtil.inflate<ViewDataBinding>(LayoutInflater.from(parent.context),
            layoutID,parent,false)
        return DataBindingViewHolder(binding)
    }

    override fun getItemCount(): Int {
        return listItems.size
    }

    override fun onBindViewHolder(holder: DataBindingViewHolder<T>, pos: Int) {
        holder.bindData(listItems.get(pos))
    }
}

DataBindingViewHolder.kt

class DataBindingViewHolder<T>(val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {

    fun bindData(model : T){
        binding.setVariable(BR.user,model)
        binding.executePendingBindings()
    }
}

TestListActivity.kt

class TestListActivity : AppCompatActivity() {

    val userList: MutableList<User> = mutableListOf(
        User("FirstName", "LastName"), User("FirstName2", "LastName")
        , User("FirstName3", "LastName"), User("FirstName4", "LastName"), User("FirstName5", "LastName"),
        User("FirstName6", "LastName"), User("FirstName", "LastName")
    )

    val personList: MutableList<Person> = mutableListOf(
        Person("PersonName -> 1"), Person("FirstName2")
        , Person("PersonName -> 3"), Person("FirstName2"), Person("FirstName"), Person("FirstName2")
        , Person("PersonName -> 6"), Person("FirstName2")
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test_list)

        recyclerView.apply {
            layoutManager = LinearLayoutManager(this@TestListActivity)
            //adapter = DataBindingBaseAdapter<User>(R.layout.item_row, userList);
            adapter = DataBindingBaseAdapter<Person>(R.layout.item_person, personList);

        }
    }
}

Можно ли отправить любую универсальную переменную на DataBindingViewHolder

binding.setVariable(BR.user,model) //for each type of Model it is BR.person and BR.user.  

Есть ли Generic variable,Или я должен передать это paramter в Adapter и получить его в DataBindingViewHolder

Обычно мы должны показать список элементов в RecyclerView.Если это возможно, это будет очень удивительно.И еще одна вещь, если я передам переменную BR.user или BR.person в качестве аргумента адаптера и установлю ее в DataBindingViewHolder

Есть ли проблемы с производительностью ??

...