![](/img/trans.png)
[英]Android, Kotlin: Recyclerview, how to prevent the last item to be shown, but pass it to the adapter
[英]Android: add a new item to a list and display it via RecyclerView adapter using Kotlin
我有一个带有 RecyclerView 的片段。 当用户单击片段中的按钮(添加新项目)时,应用程序会将用户(通过意图)带到一个表单以填写一些数据。
当我单击 (ADD ITEM) 时,它应该将数据添加到数组列表并完成该屏幕。 回到片段之后,应该使用适配器将这些数据添加到 RecyclerView 中。
这是我的代码:
这是片段:
private val REQUEST_CODE = 2
internal lateinit var adapter: ShipmentItemAdapter
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater!!.inflate(R.layout.fragment_step_three_shipment, container, false)
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btnAddNewShipmentStep3.setOnClickListener {
val intent = Intent(context, AddItemActivity::class.java)
startActivityForResult(intent, REQUEST_CODE)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data);
val items = ArrayList<ItemsItem>()
if (requestCode == REQUEST_CODE) {
adapter = ShipmentItemAdapter(context, items)
if (resultCode == Activity.RESULT_OK) {
itemsShipments.visibility = View.VISIBLE
itemsShipments.layoutManager = LinearLayoutManager(context)
itemsShipments.setHasFixedSize(true)
itemsShipments.adapter = adapter
} else if (resultCode == Activity.RESULT_CANCELED) {
itemsShipments.visibility = View.GONE
}
}
}
这是活动:
class AddItemActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_add_item_form)
linPackageAddShipment.setOnClickListener {
edtPackageAddShipment.requestFocus()
}
linPiecesAddShipment.setOnClickListener {
edtPiecesAddShipment.requestFocus()
}
linWeightAddShipment.setOnClickListener {
edtWeightAddShipment.requestFocus()
}
linDescriptionAddShipment.setOnClickListener {
edtDescriptionAddShipment.requestFocus()
}
btnAddItemAddShipment.setOnClickListener {
val errors = collectData()
collectData()
if (errors.isEmpty()) {
val intent = Intent()
setResult(Activity.RESULT_OK, intent)
finish()
} else {
val errorBody = errors.map { getString(it) }.joinToString("\n") { it }
MaterialDialog.Builder(this)
.title("Oops")
.content(errorBody)
.positiveText(R.string.ok)
.positiveColor(ContextCompat.getColor(this, R.color.colorPrimary))
.onAny({ dialog, _ -> dialog.dismiss() })
.show()
}
}
}
private fun collectData(): ArrayList<Int> {
val errors = ArrayList<Int>()
val item = ItemsItem()
if (edtPackageAddShipment.text.toString().isEmpty()) {
errors.add(R.string.packages_must_not_be_empty)
} else {
item.numberOfPackages = edtPackageAddShipment.text.toString().toInt()
}
if (edtPiecesAddShipment.text.toString().isEmpty()) {
errors.add(R.string.pieces_must_not_be_empty)
} else {
item.numberOfPieces = edtPiecesAddShipment.text.toString()
}
if (edtWeightAddShipment.text.toString().isEmpty()) {
errors.add(R.string.weight_must_not_be_empty)
} else {
item.weightUnit = edtWeightAddShipment.text.toString().toInt()
}
if (edtHeightAddShipment.text.toString().isEmpty()) {
errors.add(R.string.height_must_not_be_empty)
} else {
item.height = edtHeightAddShipment.text.toString()
}
if (edtWidthAddShipment.text.toString().isEmpty()) {
errors.add(R.string.width_must_not_be_empty)
} else {
item.width = edtWidthAddShipment.text.toString()
}
if (edtLengthAddShipment.text.toString().isEmpty()) {
errors.add(R.string.length_must_not_be_empty)
} else {
item.length = edtLengthAddShipment.text.toString()
}
if (edtDescriptionAddShipment.text.toString().isEmpty()) {
errors.add(R.string.description_must_not_be_empty)
} else {
item.description = edtDescriptionAddShipment.text.toString()
}
CreateNewShipmentActivity.mainShipment.shipmentObj.items?.add(item)
return errors
}
override fun onBackPressed() {
setResult(Activity.RESULT_CANCELED)
super.onBackPressed()
}
}
这是适配器:
class ShipmentItemAdapter internal constructor(private val context: Context, private val items: List<ItemsItem>) : RecyclerView.Adapter<ShipmentItemAdapter.MyViewHolder>() {
private val inflater: LayoutInflater = LayoutInflater.from(context)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = inflater.inflate(R.layout.item_shipment_package, parent, false)
return MyViewHolder(view).listen { pos, type ->
val item = items[pos]
val intent = Intent(context, AddItemActivity::class.java)
startActivity(context, intent, null)
}
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.namePackageShipmentPackage.text = items[position].description
holder.quantityPackageShipmentPackage.text = items[position].description
holder.dimensionPackageHeightShipmentPackage.text = items[position].description
holder.dimensionPackageWidthShipmentPackage.text = items[position].description
holder.dimensionPackageLengthShipmentPackage.text = items[position].description
}
override fun getItemCount(): Int {
return items.size
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var namePackageShipmentPackage: AppCompatTextView = itemView.findViewById(R.id.namePackageShipmentPackage)
var quantityPackageShipmentPackage: AppCompatTextView = itemView.findViewById(R.id.quantityPackageShipmentPackage)
var dimensionPackageHeightShipmentPackage: AppCompatTextView = itemView.findViewById(R.id.dimensionPackageHeightShipmentPackage)
var dimensionPackageWidthShipmentPackage: AppCompatTextView = itemView.findViewById(R.id.dimensionPackageWidthShipmentPackage)
var dimensionPackageLengthShipmentPackage: AppCompatTextView = itemView.findViewById(R.id.dimensionPackageLengthShipmentPackage)
}
private fun <T : RecyclerView.ViewHolder> T.listen(event: (position: Int, type: Int) -> Unit): T {
itemView.setOnClickListener {
event.invoke(adapterPosition, itemViewType)
}
return this
}
这些是对象模型:
class ShipmentObj {
var items: ArrayList<ItemsItem?>? = null
}
data class ItemsItem(
var numberOfPieces: String? = null,
var length: String? = null,
var description: String? = null,
var numberOfPackages: Int? = null,
var number: Int? = null,
var width: String? = null,
var height: String? = null,
var weightUnit: Int? = null
)
当我尝试添加新项目时,片段中没有显示任何内容! 我现在不知道错在哪里?
谢谢。
您需要首先在您的适配器中添加一个用于向 Array 添加新项目的函数,在您的情况下是“项目:列表”:
第一步:
fun addNewItem(itemsNew: List<ItemsItem>){ items.clear() // ->> optional if you need have clear of object items.addAll(itemsNew) notifyDataSetChanged() }
然后,在 onActivityResult 的片段中,当您收到 Activity.RESULT_OK 时,您可能会添加新项目
adapter.addNewItem(itemsNew)
在 onActivityResult 你可以看到你的代码中的错误你做这样的事情
val items = ArrayList<ItemsItem>()
adapter = ShipmentItemAdapter(context, items)
您为适配器分配了一个空的项目列表。 如果我没猜错,您也不会传递您要发送的项目。
if (errors.isEmpty()) {
val intent = Intent()
setResult(Activity.RESULT_OK, intent)
finish()
}
结果您完成了活动而没有传递任何项目。 之前的活动没有收到任何东西。 我无法执行您的代码,因为我没有执行它的所有元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.