概述:
类似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
}
}
}
}
}
网友评论