Android仿微信发起群聊的列表样式

场景:今天一个朋友微信找我说碰到个问题让我看下,就是仿微信发起群聊的那个列表样式,其实这个功能实现起来没什么困难的地方,但是他遇到的问题是,最后的那个“搜索”,随着前边列表的增加或删除动态的移动,他不知道怎么处理,我就帮忙看了下。其实网上也有类似仿微信发起群聊的文章,但是都是那个“搜索”固定在右侧的,所以这里需要特殊处理下。

方案
列表的样式,通过使用RecyclerView来实现
最后的“搜索”动态移动,通过动态设置RecyclerView的宽度来实现
每次增加或删除动态移动到最后一个条目,通过调用RecyclerView的scrollToPosition()方法来实现

效果如下(不是很清晰,凑合着看下吧。。)
仿微信发起群聊的效果
首先来看下RecyclerView所在的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/id_recyclerview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:overScrollMode="never" />

    <TextView
        android:id="@+id/tv_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="5dp"
        android:text="增加" />

    <TextView
        android:id="@+id/tv_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="5dp"
        android:text="删除" />

</LinearLayout>

然后是item的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="#44ff0000">

    <TextView
        android:id="@+id/id_num"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center" />

</LinearLayout>

注:父布局的LinearLayout宽设为android:layout_width=”match_parent”,RecyclerView的宽设为android:layout_width=”wrap_content”,给item设置固定宽高

接着是RecyclerView的adapter中增加和删除的方法

    //添加数据
    public void addData(int position) {
        mList.add(position, position + "");
        notifyItemInserted(position);
    }

    //删除数据
    public void removeData(int position) {
        mList.remove(position);
        notifyItemRemoved(position);
    }

最后是activity中点击增加或删除时的点击事件的处理

mAdapter.addData(list.size());
                if (list.size() >= 3) {
                    ViewGroup.LayoutParams params = new LinearLayout.LayoutParams(
                            ScreenUtil.dp2px(getBaseContext(), 300), ViewGroup.LayoutParams.WRAP_CONTENT);
                    mRecyclerView.setLayoutParams(params);
                }
                mRecyclerView.scrollToPosition(mAdapter.getItemCount() - 1);//每次增加一条后RecyclerView滑动到最后

注:这里就是实现增加条目后“增加”“删除”可以随之移动,并且在增加到三条以上时固定在右侧的逻辑,主要是通过当大于3条时RecyclerView宽度设置为固定宽度,这里给的300是因为单个item布局中的宽度为100,所以三个就是300

mAdapter.removeData(list.size() - 1);
                if (list.size() < 3) {
                    ViewGroup.LayoutParams params = new LinearLayout.LayoutParams(
                            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                    mRecyclerView.setLayoutParams(params);
                }
                mRecyclerView.scrollToPosition(mAdapter.getItemCount() - 1);

注:这里就是实现删除条目到三条以内时后“增加”“删除”可以随之移动的逻辑,主要是通过当小于3条时RecyclerView宽度设置为自适应

其实整个实现逻辑还是比较简单的,这里就不放出完整代码了,如果有童鞋确实需要完整代码的话,可以在评论里说下,看到后我会把源码上传到github上供大家参考,能力有限,如果不对之处,还望指正~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值