场景:今天一个朋友微信找我说碰到个问题让我看下,就是仿微信发起群聊的那个列表样式,其实这个功能实现起来没什么困难的地方,但是他遇到的问题是,最后的那个“搜索”,随着前边列表的增加或删除动态的移动,他不知道怎么处理,我就帮忙看了下。其实网上也有类似仿微信发起群聊的文章,但是都是那个“搜索”固定在右侧的,所以这里需要特殊处理下。
方案:
列表的样式,通过使用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上供大家参考,能力有限,如果不对之处,还望指正~