Как сделать последний джетпак «Вид привязки» в адаптере, привязать виды? - PullRequest
5 голосов
/ 02 марта 2020

Как сделать последний джетпак «Вид привязки» в адаптере, для автоматической привязки видов. Я не использую findVeiwById или Butterknife или Kotlin syntheti c ??? Я использовал новый вид привязки и работает нормально для деятельности и для фрагмента. Я могу видеть файлы ActivityHomeBinding и FragmentHomeBinding после включения viewBinding в файле build.gradle. Кроме того, я вижу класс ItemListBinding для используемого элемента xml, т.е. item_list. xml. Но как использовать этот файл в адаптере программы повторного просмотра

viewBinding {
        enabled = true
}

Домашний файл активности

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityHomeBinding.inflate(layoutInflater)
        setContentView(binding.root)
}

Фрагмент

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        binding = FragmentHomeBinding.inflate(inflater, container, false)
        val view = binding.root
        return view
}

Базовый адаптер: Хотите использовать привязку вида здесь. Я могу видеть ItemListBinding, но не понимаю, как его использовать.

class BaseAdapter @Inject constructor(
    private val context: Context,
    private val picasso: Picasso
) :
    RecyclerView.Adapter<BaseAdapter.ViewHolder>() {

    private var data = ArrayList<Data>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            LayoutInflater.from(context).inflate(R.layout.item_list, parent, false)
        )
    }

    override fun getItemCount() = data.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        with(holder) {
              // TODO
        }
    }

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {

        @BindView(R.id.tvMovieName)
        lateinit var nameTV: TextView

        @BindView(R.id.imageView)
        lateinit var bannerImage: ImageView

        init {
            ButterKnife.bind(this@ViewHolder, view)
        }
    }

    fun setData(serverData: ArrayList<Data>) {
        data = serverData
        notifyDataSetChanged()
    }
}

Ответы [ 3 ]

2 голосов
/ 02 марта 2020

Найден другой, чтобы решить это

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ItemListBinding.inflate(LayoutInflater.from(context), parent, false)
        return MovieViewHolder(binding)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        with(holder) {

            with(moviesData[position]) {
                binding.tvMovieName.text = title
            }
        }
    }
}

class MovieViewHolder(val binding: ItemMovieBinding) : RecyclerView.ViewHolder(binding.root)
2 голосов
/ 02 марта 2020

Вы можете использовать stati c bind метод ViewBinding для создания привязки из уже существующего макета. Добавьте его в качестве свойства для держателя просмотра:

class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
   val binding = ItemListBinding.bind(view)
}

, тогда вы сможете получить доступ ко всем представлениям через поле binding, например:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    with(holder) {
          // TODO
          binding.tvMovieName.text = data[position].title
          binding.imageView.setDrawableImage(data[position].image)
    }
}
0 голосов
/ 02 марта 2020

Ничего особо не меняется по сравнению с тем, как вы обычно это делаете.

class DataAdapter(
    private val context: Context,
    private val picasso: Picasso
) : RecyclerView.Adapter<DataAdapter.ViewHolder>() {
    private var dataList: List<Data> = Collections.emptyList()

    override fun getItemCount() = dataList.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = ViewHolder(
        LayoutInflater.from(context).inflate(R.layout.item_list, parent, false)
    )

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(dataList[position])
    }

    fun setData(dataList: List<Data>) {
        this.dataList = dataList
        notifyDataSetChanged()
    }

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        private val binding = ItemListBinding.bind(view)   

        fun bind(data: Data) {
            with(binding) {
                // TODO
                nameTV.text = data.name
                bannerImage.loadWithPicasso(picasso, data.imageUrl)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...