[英]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。)
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
TextView
而不是同时进行多个选择,所以我认为做你想做的事情,我们有点想使用BackgroundColorSpan
模拟这种行为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.