简体   繁体   English

允许在 android recyclerview 中一次从不同的 textview 项目中选择文本

[英]Allow selecting text from different textview items at once in android recyclerview

There are many Textviews in a Recyclerview, selecting the text content of each one with long click all right but selection pins don't allow to select test from next TextView, it allow selecting only inside current TextView. Recyclerview中有很多Textviews,可以长按选择每个文本内容,但是选择引脚不允许从下一个TextView进行select测试,它只允许选择当前Z622DC6E792DB40F121FCBD3FC03内部。 How to allow overflow text selection that contains different TextView items?如何允许包含不同 TextView 项目的溢出文本选择?

For exampe as seen on the picture below, TextView one is green, TextView two is purple, when selection start on green one the selection doesn't countinue to beyond the green one. For exampe as seen on the picture below, TextView one is green, TextView two is purple, when selection start on green one the selection doesn't countinue to beyond the green one. So both green and purple TextViews should be selectable sometime.所以绿色和紫色的 TextViews 应该在某个时候都可以选择。

(After that I should get the selected text and its TextViews.) (之后我应该得到选定的文本及其 TextViews。)

在此处输入图像描述

Solution解决方案

  • Since Selection can be done for 1 TextView not a multiple of them at the same time, I think to do what you want we kinda wanna mock that behavior using BackgroundColorSpan由于可以为 1 个TextView而不是同时进行多个选择,所以我认为做你想做的事情,我们有点想使用BackgroundColorSpan模拟这种行为
  • Note that we will be able to show thee highlight like a selection but won't be able to show selection handlers请注意,我们将能够像选择一样显示突出显示,但无法显示选择处理程序

Preview预习

用户界面预览

Code代码

Activity.kt活动.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.EditText
import android.widget.TextView
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.maproductions.mohamedalaa.stackoverflow_solutions.R
import com.maproductions.mohamedalaa.stackoverflow_solutions.view.rv_adapter.RVAdapterRVTextViewsSeveralTextSelectionActivity
import kotlinx.android.synthetic.main.activity_r_v_text_views_several_text_selection.*
import mohamedalaa.mautils.core_android.extensions.toast

class RVTextViewsSeveralTextSelectionActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_r_v_text_views_several_text_selection)

        val adapter = RVAdapterRVTextViewsSeveralTextSelectionActivity()
        recyclerView.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = adapter

        toastAllMaterialButton.setOnClickListener {
            toast(adapter.getAllSelectedTexts().joinToString("\n"))
        }
    }
}

activity.xml活动.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".view.RVTextViewsSeveralTextSelectionActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"

        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <com.google.android.material.button.MaterialButton
        android:id="@+id/toastAllMaterialButton"

        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        android:layout_margin="16dp"

        android:text="Toast all selected texts as several lines"
        android:textAllCaps="false"
        android:textSize="20sp"/>

</LinearLayout>

RecyclerViewAdapter.kt RecyclerViewAdapter.kt

import android.annotation.SuppressLint
import android.graphics.Color
import android.text.style.BackgroundColorSpan
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.text.buildSpannedString
import androidx.recyclerview.widget.RecyclerView
import com.maproductions.mohamedalaa.stackoverflow_solutions.R
import mohamedalaa.mautils.core_android.extensions.inflateLayout
import mohamedalaa.mautils.core_android.extensions.plusAssign

@SuppressLint("SetTextI18n")
class RVAdapterRVTextViewsSeveralTextSelectionActivity
    : RecyclerView.Adapter<RVAdapterRVTextViewsSeveralTextSelectionActivity.ViewHolder>() {

    // Set this color to whichever color you want.
    private val highlightingTextColor = Color.parseColor("#CBDCFF")

    private val selectedIndices = mutableListOf<Int>()

    override fun getItemCount(): Int = 20

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            parent.context.inflateLayout(R.layout.rv_item_activity_r_v_text_views_several_text_selection)
        )
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.textView.text = buildSpannedString {
            append(getTextAtIndex(position))

            if (position in selectedIndices) {
                this += BackgroundColorSpan(highlightingTextColor)
            }
        }

        holder.itemView.setOnLongClickListener {
            if (position in selectedIndices) {
                selectedIndices -= position
            }else {
                selectedIndices += position
            }

            notifyItemChanged(position)

            true
        }
    }

    fun getAllSelectedTexts(): List<String> {
        return selectedIndices.map { getTextAtIndex(it) }
    }

    // getTextAtIndex is instead of myData.get(position).name
    private fun getTextAtIndex(index: Int): String {
        return "I am a text with index -> $index"
    }

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val textView: TextView = itemView.findViewById(R.id.textView)
    }

}

recycler_view_item.xml recycler_view_item.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/textView"

    android:padding="16dp"

    android:textSize="24sp"
    android:textColor="@android:color/black"

    tools:text="I am a text with index -> 0" />

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM