データ収集に関する考え方の簡素化: 構造化ビュー データは UI の変更後に自動的に更新されます

下図のように、インターフェース上のどの要素が選択されているかを収集する必要があります。また、選択された項目の完全な情報を返す必要があります。選択されていない場合は空を返す必要がありますが、タイトル: 処理速度などの行の他の情報を返す必要があります。
従来の方法は 2 つあり、
まず、クリックして選択し、現在の項目 isSelected を true としてマークします。「送信」をクリックすると、すべての要素が走査され、isSelected が true であるデータが検索されます。
第 2 に、要素が選択されるたびに、選択結果が自動的に更新され、選択アクションが発生したときに現在の結果が計算されます。外部アクセス (データの送信など) は、最終結果に直接アクセスするだけで済みます。

ここに画像の説明を挿入

キーコード:

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

コードのアイデア:
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_フィードバック_構造化コメント.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_フィードバック_structed_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

おすすめ

転載: blog.csdn.net/adayabetter/article/details/128204152