Simplified thinking about data collection: structured View data is automatically updated following UI changes

As shown in the figure below, it is necessary to collect which elements on the interface are selected. And it needs to return the complete information of the selected Item, if it is not selected, it needs to return empty, but other information of the row needs to be returned, such as title: Processing speed, etc.
There are two conventional methods.
First, click to select and mark the current Item isSelected as true. When submit is clicked, all elements are traversed to find the data whose isSelected is true.
Second, every time an element is selected, the selection result is automatically updated, and the current result is calculated when the selection action occurs. External access (such as submitting data) only needs to directly access the final result.

insert image description here

key code:

//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()
    }

Code idea:
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>

StructuredLabelItem.kt

data class StructuredLabelItem(var labelId: String?, var labelName: String?, var labelValueOptions: ArrayList<ValueOptionItem?>?) : Serializable

ValueOptionItem.kt

data class ValueOptionItem(var labelValueId: String?, var labelValueName: String?, var displayOption: String?, var score: String?, var isSelected: Boolean? = false) : Serializable

Guess you like

Origin blog.csdn.net/adayabetter/article/details/128204152