1.創建佈局文件,word_fragment用來放Recycle,word_fragment_grad_cell用來放小單元
word_fragment佈局:
word_fragment_grad_cell佈局:(卡片佈局)
2.創建適配器wordFragmentAdapter類
package com.example.ngsl.wordFragment
import android.content.Intent
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.example.ngsl.R
import com.example.ngsl.room.Word
import kotlinx.android.synthetic.main.word_fragment_grad_cell.view.*
//適配器:告訴view有哪些內容,並且如何填充view
class WordFragmentAdapter : ListAdapter<Word, MyViewHolder>(DiffCallBack) {
//比較器,比較每一行的對象
object DiffCallBack : DiffUtil.ItemCallback<Word>() {
override fun areItemsTheSame(oldItem: Word, newItem: Word): Boolean {
//比較是不是同一個對象
return oldItem.wordId == newItem.wordId
}
override fun areContentsTheSame(oldItem: Word, newItem: Word): Boolean {
//比較內容是否相同
return oldItem == newItem
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
//加載view,就是每一個小單元word_fragment_grad_cell
val view = LayoutInflater.from(parent.context).inflate(R.layout.word_fragment_grad_cell, parent, false)
val holder = MyViewHolder(view)
holder.itemView.apply {
//將監聽事件放在這,就不會每次加載一個item時新創建監聽事件
val onClickListener = View.OnClickListener {
val uri = Uri.parse("https://m.youdao.com/dict?le=eng&q=${this.textViewEnglish.text}")
Intent(Intent.ACTION_VIEW).apply {
this.data = uri
holder.itemView.context.startActivity(this)
}
}
this.textViewEnglish.setOnClickListener(onClickListener)
this.imageView.setOnClickListener(onClickListener)
}
return holder
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
//加載資源
holder.itemView.apply {
val item = getItem(position)
this.textViewWordId.text = item.wordId.toString()
this.textViewEnglish.text = item.english
}
}
}
//這個很重要
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
3.在wordFragment中加載適配器
fragment最好在onActivityCreated中操作
package com.example.ngsl.wordFragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager
import com.example.ngsl.R
import kotlinx.android.synthetic.main.word_fragment.*
class WordFragment : Fragment() {
//ViewModel 管理數據的
private lateinit var viewModel: WordViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.word_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
//創建適配器
val wordFragmentAdapter = WordFragmentAdapter()
recycleView.apply {
adapter = wordFragmentAdapter
//頁面佈局,1列
layoutManager = GridLayoutManager(requireContext(), 1)
}
//ViewModel
viewModel = ViewModelProvider(this).get(WordViewModel::class.java)
viewModel.allWord.observe(viewLifecycleOwner, Observer {
//爲適配器提供數據
wordFragmentAdapter.submitList(it)
})
//這是一個小功能,可以拖動列表的item
// ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.START) {
// override fun onMove(
// recyclerView: RecyclerView,
// viewHolder: RecyclerView.ViewHolder,
// target: RecyclerView.ViewHolder
// ): Boolean {
// return false
// }
//
// override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
// //滑動之後要做的事
// val itemPosition = viewHolder.adapterPosition //獲取被刪除對象的位置
// //更新列表數據
// }
// }).attachToRecyclerView(recycleView)
}
}
4.GitHub源碼鏈接
整個項目有很多組件,只看你需要的部分:https://github.com/YDDUONG/NGSL-English
如果覺得有用,點個贊吧