【移动应用开发技术】Android如何实现仿微信朋友圈点击评论自动定位到相关行功能_第1页
【移动应用开发技术】Android如何实现仿微信朋友圈点击评论自动定位到相关行功能_第2页
【移动应用开发技术】Android如何实现仿微信朋友圈点击评论自动定位到相关行功能_第3页
【移动应用开发技术】Android如何实现仿微信朋友圈点击评论自动定位到相关行功能_第4页
【移动应用开发技术】Android如何实现仿微信朋友圈点击评论自动定位到相关行功能_第5页
已阅读5页,还剩8页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】Android如何实现仿微信朋友圈点击评论自动定位到相关行功能

这篇文章主要介绍了Android如何实现仿微信朋友圈点击评论自动定位到相关行功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让在下带着大家一起了解一下。打开你的微信朋友圈,点击评论,你就会发现有一个小细节:文本输入框的高度恰好定位到这条信息的底部位置这个实现起来其实很简单,咱们就来看看吧最简单的RecyclerView依然是先实现RecyclerView。跟朋友圈一样,我们也把头给加上去,这样我们在点第一条信息的时候,效果会更好一些信息内容简单些,反正我们就看看效果<?xml

version="1.0"

encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="wrap_content">

<TextView

android:id="@+id/tv_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="12sp"

/>

<TextView

android:id="@+id/tv_comment"

android:text="评论"

android:textSize="14sp"

android:layout_margin="5dip"

android:textColor="@color/colorAccent"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

/>

</LinearLayout>头部也很简单,就一张图片作为区分<?xml

version="1.0"

encoding="utf-8"?>

<RelativeLayout

xmlns:android="/apk/res/android"

android:layout_width="match_parent"

android:layout_height="300dip">

<ImageView

android:layout_centerInParent="true"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@mipmap/ic_launcher"/>

</RelativeLayout>消息内容就以string作为信息数据类型,头的数据类型为TopClassdata

class

TopClass(val

value:

String)实现一个adapterclass

MainAdapter(private

val

beans:

ArrayList<Any>,

val

context:

Context)

:

RecyclerView.Adapter<RecyclerView.ViewHolder>()

{

var

height

=

0

enum

class

TYPE(val

value:

Int)

{

TOP(0),

NORMAL(1)

}

override

fun

onCreateViewHolder(parent:

ViewGroup?,

viewType:

Int):

RecyclerView.ViewHolder

{

when(viewType)

{

TYPE.NORMAL.value

->

{

val

view

=

LayoutInflater.from(context).inflate(R.layout.adapter_main,

parent,

false)

return

MainNormalViewHolder(view)

}

TYPE.TOP.value

->

{

val

view

=

LayoutInflater.from(context).inflate(R.layout.adapter_top,

parent,

false)

return

MainTopViewHolder(view)

}

}

throw

Exception()

}

override

fun

getItemCount()

=

beans.size

override

fun

onBindViewHolder(holder:

RecyclerView.ViewHolder?,

position:

Int)

{

if

(holder

!=

null)

{

when(getItemViewType(position))

{

TYPE.NORMAL.value

->

{

(holder

as

MainNormalViewHolder).setText(beans[position]

as

String)

holder.clickComment(holder.layoutPosition)

}

TYPE.TOP.value

->

{}

}

}

}

override

fun

getItemViewType(position:

Int):

Int

{

when(beans[position])

{

is

String

->

return

TYPE.NORMAL.value

is

TopClass

->

return

TYPE.TOP.value

}

return

super.getItemViewType(position)

}

inner

class

MainNormalViewHolder(itemView:

View)

:

RecyclerView.ViewHolder(itemView)

{

fun

setText(text:

String)

{

itemView.tv_title.text

=

text

}

fun

clickComment(position:

Int)

{

itemView.tv_comment.setOnClickListener

{

(context

as

MainActivity).showInputComment(itemView.tv_comment,

position)

}

}

}

inner

class

MainTopViewHolder(itemView:

View)

:

RecyclerView.ViewHolder(itemView)

}这样一个列表就完成了输入框的产生这里有一个关键的地方,如何将EditText悬浮在键盘上,并且RecyclerView不会被挤上去。这里我们可以使用Dialog,同时在布局中要使用ScrollView来进行占位<?xml

version="1.0"

encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

<ScrollView

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1">

</ScrollView>

<View

android:layout_width="match_parent"

android:layout_height="0.5dip"

android:background="#666666"></View>

<LinearLayout

android:id="@+id/dialog_layout_comment"

android:layout_width="match_parent"

android:layout_height="wrap_content">

<EditText

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_weight="1"/>

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="确认"/>

</LinearLayout>

</LinearLayout>只有ScrollView进行配合,才能实现我们的效果。来看看效果列表的滚动输入框也有了,这时候就差滚动了。我们可以通过smoothScrollBy来让RecyclerView按X或者Y轴进行滚动。那我们这里到底应该滚动多少距离才对呢?,咱们来计算一下吧图中红色部分为键盘展现之前某条信息评论区所在位置;蓝色部分为键盘,当键盘打开的时候,我们需要将红色的部分移动到黄色的位置。这样黄色顶部与红色顶部中间的区域高度,就是RecyclerView需要滚动的数值这样就好办了,我们使用getLocationOnScreen去获取差值,再加上评论区域高度就行了fun

showInputComment(commentView:

View,

position:

Int)

{

//

RV中评论区起始Y的位置

val

rvInputY

=

getY(commentView)

val

rvInputHeight

=

commentView.height

dialog

=

Dialog(this,

android.R.style.Theme_Translucent_NoTitleBar)

dialog!!.setContentView(R.layout.dialog_comment)

dialog!!.show()

val

handler

=

object

:

Handler()

{}

handler.postDelayed({

//

对话框中的输入框Y的位置

val

dialogY

=

getY(dialog!!.findViewById<LinearLayout>(R.id.dialog_layout_comment))

rv_main.smoothScrollBy(0,

rvInputY

-

(dialogY

-

rvInputHeight))

},

300)

}

private

fun

getY(view:

View):

Int

{

val

rect

=

IntArray(2)

view.getLocationOnScreen(rect)

return

rect[1]

}来看看效果但是还有几个小问题,如果是点击最后一行的话,会因为滚动空间不足而不能实现相同的效果,并且按返回键的时候,键盘先消失,然后再按一次之后Dialog才消失。针对第一个问题,我们直接添加一个空View作为列表最后一项即可,并且高度要等于输入框的高度;第二个问题也很简单,就是监听键盘弹出与隐藏时View高度发生的变化dataclassBottomClass(valvalue:String)点击的时候再添加handler.postDelayed({

//

对话框中的输入框Y的位置

val

dialogY

=

getY(dialog!!.findViewById<LinearLayout>(R.id.dialog_layout_comment))

if

(position

==

arrays.size

-

1)

{

arrays.add(BottomClass(""))

adapter?.height

=

dialog!!.findViewById<LinearLayout>(R.id.dialog_layout_comment).height

adapter?.notifyDataSetChanged()

}

rv_main.smoothScrollBy(0,

rvInput

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论