Pensamiento simplificado sobre la recopilación de datos: los datos de Vista estructurada se actualizan automáticamente después de los cambios en la interfaz de usuario

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.

inserte la descripción de la imagen aquí

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

Supongo que te gusta

Origin blog.csdn.net/adayabetter/article/details/128204152
Recomendado
Clasificación