Como se muestra en la figura a continuación, es necesario recopilar qué elementos de la interfaz se seleccionan. Y necesita devolver la información completa del artículo seleccionado, si no está seleccionado, debe devolver vacío, pero debe devolver otra información de la fila, como título: velocidad de procesamiento, etc.
Existen dos métodos convencionales:
primero, haga clic para seleccionar y marcar el elemento actual isSelected como verdadero. Cuando se hace clic en enviar, se recorren todos los elementos para encontrar los datos cuyo isSelected es verdadero.
En segundo lugar, cada vez que se selecciona un elemento, el resultado de la selección se actualiza automáticamente y el resultado actual se calcula cuando se produce la acción de selección. El acceso externo (como el envío de datos) solo necesita acceder directamente al resultado final.
clave:
//ListView getView部分代码
// 结构化View初始化
if (viewHolder.scv_labels != null && itemData != null) {
boolean hasReviewLabelDTOList = itemData.reviewLabelDTOList != null && itemData.reviewLabelDTOList.size() > 0;
if (hasReviewLabelDTOList) {
// 设置数据
viewHolder.scv_labels.setData(itemData);
}
if (itemData.proDescEval > NO_STAR && hasReviewLabelDTOList) {
// 显示隐藏
viewHolder.scv_labels.setVisibility(View.VISIBLE);
} else {
viewHolder.scv_labels.setVisibility(View.GONE);
}
}
//点击Item,自动计算当前选择结果
inner class LabelItemClickImpl: ILabelItemClickListener {
override fun onItemClick() {
curViewData?.selectedLabelData = getStructuredLabelData()
}
}
fun getStructuredLabelData(): Any {
if (curViewData == null || curViewData?.reviewLabelDTOList == null || curViewData?.reviewLabelDTOList?.size == 0) {
return ""
}
curViewData?.reviewLabelDTOList?.let {
val selectedLabelData : ArrayList<StructuredLabelItem> = ArrayList()
for (i in it.indices) {
val itemData = adapterList[i]?.getSelectedItem()
selectedLabelData.add(StructuredLabelItem(it[i].labelId, it[i].labelName, itemData))
}
return JSONObject.toJSON(selectedLabelData)
}
return ""
}
fun getSelectedItem(): ArrayList<ValueOptionItem?> {
if (currentSelectedIndex >= 0 && currentSelectedIndex < data.size) {
val selectedList = ArrayList<ValueOptionItem?>()
selectedList.add(data[currentSelectedIndex])
return selectedList
}
return ArrayList()
}
Idea de código:
StructuredCommentView.kt
// 结构化评价整体View
class StructuredCommentView : LinearLayout {
private lateinit var recyclerView: RecyclerView
private lateinit var adapter: CommentsItemAdapter
private var curViewData: LeaveFeedbackFragment.ViewData? = null
constructor(context: Context) : super(context) {
init()
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
init()
}
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
init()
}
private fun init() {
val view = LayoutInflater.from(context).inflate(R.layout.m_myorder_frag_leave_feedback_structured_comment, this)
recyclerView = view.findViewById(R.id.rv_structured_comments)
val layoutManager = LinearLayoutManager(context)
layoutManager.orientation = LinearLayoutManager.VERTICAL
recyclerView.layoutManager = layoutManager
}
fun setData(viewData: LeaveFeedbackFragment.ViewData) {
if (curViewData != viewData) {
curViewData = viewData
curViewData?.reviewLabelDTOList?.let {
setDataInner(it) }
}
}
private fun setDataInner(structuredLabelItems: ArrayList<StructuredLabelItem>) {
adapter = CommentsItemAdapter(structuredLabelItems, context)
recyclerView.adapter = adapter
}
fun getStructuredLabelData(): Any {
return adapter.getStructuredLabelData()
}
inner class CommentsItemAdapter(val data: List<StructuredLabelItem>, val context: Context) :
RecyclerView.Adapter<CommentsItemAdapter.ViewHolder>() {
val adapterList = arrayOfNulls<StructuredCommentItemAdapter>(data.size)
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var titleView: TextView = itemView.findViewById(R.id.tv_title)
var recyclerView: RecyclerView = itemView.findViewById(R.id.rv_structured_comment)
fun bind(structuredLabelItem: StructuredLabelItem?, position: Int) {
if (structuredLabelItem == null) {
return
}
titleView.text = structuredLabelItem.labelName
structuredLabelItem.labelValueOptions?.let {
if (it.size > 0) {
val layoutManager = LinearLayoutManager(context)
layoutManager.orientation = LinearLayoutManager.HORIZONTAL
recyclerView.layoutManager = layoutManager
val adapter = StructuredCommentItemAdapter(it, context)
adapter.setLabelItemClickListener(LabelItemClickImpl())
recyclerView.adapter = adapter
adapterList[position] = adapter
}
}
}
}
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.m_myorder_frag_leave_feedback_structured_comment_item, null)
return ViewHolder(view)
}
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
viewHolder.bind(data[position], position)
}
override fun getItemCount(): Int {
return data.size
}
fun getStructuredLabelData(): Any {
if (curViewData == null || curViewData?.reviewLabelDTOList == null || curViewData?.reviewLabelDTOList?.size == 0) {
return ""
}
curViewData?.reviewLabelDTOList?.let {
val selectedLabelData : ArrayList<StructuredLabelItem> = ArrayList()
for (i in it.indices) {
val itemData = adapterList[i]?.getSelectedItem()
selectedLabelData.add(StructuredLabelItem(it[i].labelId, it[i].labelName, itemData))
}
return JSONObject.toJSON(selectedLabelData)
}
return ""
}
}
interface ILabelItemClickListener {
fun onItemClick()
}
inner class LabelItemClickImpl: ILabelItemClickListener {
override fun onItemClick() {
curViewData?.selectedLabelData = getStructuredLabelData()
}
}
}
m_myorder_frag_leave_feedback_structured_comment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_structured_comments"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
StructuredCommentItemAdapter.kt
class StructuredCommentItemAdapter(val data: List<ValueOptionItem?>, val context: Context) :
RecyclerView.Adapter<StructuredCommentItemAdapter.ViewHolder>() {
private val ITEM_NUM = 3
private val itemWidth = (AndroidUtil.getScreenWidth(context) - AndroidUtil.dp2px(context, 48f)) / ITEM_NUM
private var currentSelectedIndex = -1
private var labelItemClickListener : StructuredCommentView.ILabelItemClickListener? = null
fun getSelectedItem(): ArrayList<ValueOptionItem?> {
if (currentSelectedIndex >= 0 && currentSelectedIndex < data.size) {
val selectedList = ArrayList<ValueOptionItem?>()
selectedList.add(data[currentSelectedIndex])
return selectedList
}
return ArrayList()
}
fun setLabelItemClickListener(listener: StructuredCommentView.ILabelItemClickListener) {
labelItemClickListener = listener
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var titleView: TextView = itemView.findViewById(R.id.tv_title)
var container: FrameLayout = itemView.findViewById(R.id.ll_container)
fun bind(valueOptionItem: ValueOptionItem?, position: Int) {
if (valueOptionItem == null) {
return
}
titleView.text = valueOptionItem.labelValueName
container.setOnClickListener {
if (position != currentSelectedIndex) {
currentSelectedIndex = position
setSelectedIndex()
labelItemClickListener?.onItemClick()
}
}
if (valueOptionItem.isSelected == true) {
currentSelectedIndex = position
container.setBackgroundResource(R.drawable.m_myorder_bg_structured_label_focused)
titleView.setTextColor(Color.parseColor("#FD384F"))
} else {
container.setBackgroundResource(R.drawable.m_myorder_bg_structured_label_unfocused)
titleView.setTextColor(Color.parseColor("#191919"))
}
}
}
@SuppressLint("NotifyDataSetChanged")
private fun setSelectedIndex() {
for (valueOptionItem : ValueOptionItem? in data) {
if (valueOptionItem == null) {
continue
}
valueOptionItem.isSelected = false
}
data[currentSelectedIndex]?.isSelected = true
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, p1: Int): ViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.m_myorder_frag_leave_feedback_structured_comment_label_item, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
viewHolder.itemView.layoutParams.width = itemWidth
val layoutParams = viewHolder.itemView.layoutParams as RecyclerView.LayoutParams
val marginRight = if (position == ITEM_NUM -1) 0 else AndroidUtil.dp2px(context, 8f)
layoutParams.setMargins(0, 0, marginRight, 0)
viewHolder.bind(data[position], position)
}
override fun getItemCount(): Int {
return data.size
}
}
m_myorder_frag_leave_feedback_structured_comment_label_item.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_container"
android:layout_width="109dp"
android:layout_height="32dp"
android:layout_marginRight="8dp"
android:paddingHorizontal="4dp"
android:paddingVertical="4dp"
android:background="@drawable/m_myorder_bg_structured_label_unfocused"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textColor="#191919"
android:autoSizeMaxTextSize="12sp"
android:autoSizeMinTextSize="10sp"
android:maxLines="2"
android:ellipsize="end"
android:autoSizeTextType="uniform"
android:text="Sluggish"/>
</FrameLayout>
ElementoEtiquetaEstructurada.kt
data class StructuredLabelItem(var labelId: String?, var labelName: String?, var labelValueOptions: ArrayList<ValueOptionItem?>?) : Serializable
ValorOpciónItem.kt
data class ValueOptionItem(var labelValueId: String?, var labelValueName: String?, var displayOption: String?, var score: String?, var isSelected: Boolean? = false) : Serializable