水平的无限滑动的选择View,绝不会OOM哦。先看截图

最近在做一个客服聊天项目,使用recyclerview做聊天列表,但是遇到了一个无法处理的问题,这问题困了我半天,也是醉了,之前使用listview没有遇到这样的,对于键盘的各种尝试都尝试了,最后还是没有解决,先来看看我已开始常规的搬砖:

图片 1

图片 2image

布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v7.widget.RecyclerView android: android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:scrollbars="vertical"/> <LinearLayout android: android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:gravity="center_vertical" android:orientation="horizontal"> <EditText android: android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="请输入发送的信息" android:imeActionId="@+id/send" android:imeOptions="actionSend" android:inputType="text" android:maxLines="1" android:singleLine="true"/> <ImageButton android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/ic_menu_send"/> </LinearLayout></LinearLayout>

没咋可说的,中规中矩,接下来在AndroidManifest.xml配置:

<activity android:name=".chat.ChatActivity" android:parentActivityName=".activity.MainActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize|stateHidden" ools:targetApi="jelly_bean"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".activity.MainActivity"/></activity>

可以看到android:windowSoftInputMode=”adjustResize|stateHidden”设置了,理论上这样就没有问题了,然而实际上并没有什么效果,这个不行,那就试试另外一个吧,android:windowSoftInputMode=”adjustPan|stateHidden”,这个是能把布局弹上去了,但是但是TM的标题一弹上去了,也就是整体布局都弹上去,后来各种折腾,也没有效果,网上各种找也没用,最后冷静下来思考,不对啊,我该设置的都设置的啊,跟之前有什么不一样呢?想想除了RecyclerView,其他没有什么不一样了,最后决定从Recyclerview入手,果然后面找到了,在设置setLayoutManager的是要先调用如下代码才有效

LinearLayoutManager layoutManager = new LinearLayoutManager;layoutManager.setStackFromEnd; //键盘弹出mRecyclerView.setLayoutManager(layoutManager);

就是调用setStackFromEnd,设置为true,这样就可以将布局跟着输入框弹上去了,而且标题没有被弹出去,而这个方法本身的意思是始终保持最新添加的item显示在recyclerview上,可以看下他的源码:

public void setStackFromEnd(boolean stackFromEnd) { assertNotInLayoutOrScroll; if (mStackFromEnd == stackFromEnd) { return; } mStackFromEnd = stackFromEnd; requestLayout();--->mRecyclerView.requestLayout();}

可以看到布局会被重新调整。最后附上效果图:

图片 3聊天列表.png

作为一个菜鸟写这个Tools前我就一直在想,我们自己的项目中有很多很棒的工具类和一些自定义的View,而这些View或者工具类在网上或有或没,既然他们懒得弄或者不屑弄,那好吧我来整理吧。也就是基于这个原因我开始创建并且维护这个库,我所希望的是这个库能帮助到一部分Android初级的开发人员,也希望每一个看到
AndroidCodeTools这个库的码神们,能多多的 Pull
你们开发中所遇到的优秀的工具类或者自定义View。

使用

像使用RecyclerView那样使用

GitHub:

setp1

repositories { ... maven { url 'https://jitpack.io' } }
  • Android工具类
  • Android自定义控件
  • Android自定义动画

step2

dependencies { compile 'com.github.aohanyao:HorizontalLoopView:v1.0.0'}

1.之前在网上看到很多人遇到过在一个TextView是实现类似于Html中的超文本点击跳转的效果,正好这次项目中正好也有这个需求,然后自己也就利用SpannableStringBuilder撸了一个工具类。当然网上也有跟多不错的实现方式,我就不在这儿累赘了,大家一起交流咯。

step3

 <com.aohanyao.loop.widget.HorizontalLoopView android: android:layout_width="match_parent" android:layout_height="80dp"/>

setTextViewHyperlink(TextView textView,String content,int
textColor,int start1,int end1, OnTextViewhyperlinkOnClickListener
listener))

step4

 HorizontalLoopView hlv1 = (HorizontalLoopView) findViewById(R.id.hlv1); //LoopViewAdapter支持泛型,只要是view的子类即可 hlv1.setLoopViewAdapter(new LoopViewAdapter() { @Override protected int setCenterIndex() { //你要默认居中的下标 return 0; } @Override public int getChildWidth() { //每个view的宽度 单位是px return 0; } @Override public int getItemCount() { //数量 return 0; } @Override public View getView(int position, boolean isCenter) { //根据下标返回相应的view , isCenter 为true,返回中间的view,可以做一些其他的样式 return null; } @Override public void setData(View scrollView, int position) { //根据下标 对对应的View 做相应的数据处理 } @Override public void onSelect(View selectView, int position) { //当数据选中的时候回调 } });

具体请直接看demo

微信号求关注

图片 4微信公众号

  • @param textView 文本控件
  • @param content 内容
  • @param textColor需要响应点击事件文本的颜色
  • @param start1 可点击文本1的开始角标
  • @param end1 可点击文本1的结束角标
  • @param start2 可点击文本2的开始角标
  • @param end2 可点击文本2的结束角标
  • @param listener 超链接点击监听

发表评论

电子邮件地址不会被公开。 必填项已用*标注