美文网首页简化开发android技术
android实现文本的展开和收回功能

android实现文本的展开和收回功能

作者: SeekLife0 | 来源:发表于2022-01-10 21:47 被阅读0次

概述:
类似B站评论的展开和收回功能


效果

实现方式 :
1、布局为一个RecyclerView
2、使用BaseQuickAdapter(https://www.jianshu.com/p
/3a3654a29193)
思路:通过当前item项内部textView组件是否存在省略字符,来判断需不需要显示展开按钮


RecyclerView的Item项布局
重点为id名称为tv_answer的textView,因为主要对它进行监听。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:orientation="vertical"
    >

    <com.hjq.shape.layout.ShapeLinearLayout
        android:id="@+id/sll_que"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:shape_radius="3dp"
        app:shape_shadowColor="@color/shadowColor"
        app:shape_shadowOffsetY="5dp"
        app:shape_shadowSize="5dp"
        app:shape_solidColor="@color/white"
        android:padding="20dp"
        >

        <LinearLayout
            android:id="@+id/rl_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <ImageView
                    android:id="@+id/iv_1"
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:src="@mipmap/ask_2x" />

                <TextView
                    android:id="@+id/tv_question"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:text="" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                >

                <ImageView
                    android:id="@+id/iv_2"
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:src="@mipmap/reply_2x" />

                <TextView
                    android:id="@+id/tv_answer"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/iv_1"
                    android:layout_marginLeft="10dp"
                    android:ellipsize="end"
                    android:lines="3"
                    android:maxLines="3"
                    android:text="" />
            </LinearLayout>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_open"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/rl_content"
            android:orientation="vertical"
            android:visibility="gone"
            >

            <TextView
                android:id="@+id/tv_open"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:text="展开"
                android:textColor="@color/address_btn_new" />
        </LinearLayout>
    </com.hjq.shape.layout.ShapeLinearLayout>

</LinearLayout>

第一步,在Activity对adapter中对展开和收回按钮进行事件监听。

override fun initDatas(parameter: JumpParameter?) {
        //接收问题列表
        queList = parameter?.get("questions") as MutableList<PackageDetailData.Data.ProblemListData>
        Log.e("问答调试", "问答列表:" + queList)
        //recycleView滑动
        val questionAdapter = QuestionAdapter()
        rcQuestion.adapter = questionAdapter
        rcQuestion.layoutManager = LinearLayoutManager(me)
        questionAdapter.setNewInstance(queList)
        //设置模块的子组件点击事件
        questionAdapter.addChildClickViewIds(R.id.tv_open,R.id.sll_que)
        //设置模块的展开、收回
        questionAdapter.setOnItemChildClickListener { adapter, view, position ->
            //设置checkbox被选中事件setOnCheckedChangeListener
            if(view.id == R.id.tv_open){
                var tvOpen = view.findViewById<TextView>(R.id.tv_open)
                //设置文本为收回
                if(tvOpen.text == "展开"){
                    var ans = adapter.getViewByPosition(position,R.id.tv_answer) as TextView
                    //设置textView为最大高度,也就是显示全部。
                    ans.maxHeight = resources.displayMetrics.heightPixels
                    //此时显示收回
                    tvOpen.text = "收回"
                }else if(tvOpen.text == "收回"){
                    var ans = adapter.getViewByPosition(position,R.id.tv_answer) as TextView
                    //限制textView的行数,也就是省略显示。
                    //此时显示展开
                    ans.maxLines = 3
                    tvOpen.text = "展开"
                }
            }
        }
    }

第二步在adapter中进行控制

class QuestionAdapter : BaseQuickAdapter<PackageDetailData.Data.ProblemListData, BaseViewHolder>(R.layout.item_ask_question) {

    override fun convert(holder: BaseViewHolder, item: PackageDetailData.Data.ProblemListData) {
        holder.setText(R.id.tv_question,item.title)
        holder.setText(R.id.tv_answer,item.answer)
        //判断textView的高度
        var tvAnswer = holder.getView<TextView>(R.id.tv_answer)//ll_open
        var ll_open = holder.getView<LinearLayout>(R.id.ll_open)
        //设置view加载完成监听
        tvAnswer.viewTreeObserver.addOnGlobalLayoutListener {
            //获取被省略的字符,0表示没被省略
            var count = tvAnswer.layout.getEllipsisCount(tvAnswer.lineCount - 1 )
            if(count > 0){
                //显示展开按钮
                ll_open.visibility = LinearLayout.VISIBLE
            }else{
                if(tvAnswer.lineCount <=3){
                    //不显示展开按钮
                    ll_open.visibility = LinearLayout.GONE
                }
            }
        }

    }

}

相关文章

网友评论

    本文标题:android实现文本的展开和收回功能

    本文链接:https://www.haomeiwen.com/subject/nzdvcrtx.html