项目要求
- 使用RecyclerView实现一个微信通讯录
设计效果
- 垂直item列表
- 按姓名首字母排序
- 根据右侧首字母bar快速查找
- 左滑删除联系人
效果演示
项目结构
实现思路
- 添加支持库打开应用模块的 build.gradle 文件dependencies 部分
dependencies {
implementation 'com.android.support:recyclerview-v7:28.0.0'
}
- 将 RecyclerView 添加到布局中
- 添加列表适配器RecyclerView.Adapter
- 调用适配器的 onCreateViewHolder() 方法
- 为列表项添加动画
- 根据网络上已有的demo将activity修改移植进wechat已有的fragment中
遇到的困难
网络上的实例是一个完整的activity,尝试过把Activity嵌入到现有的Fragment中行不通,因为Fragment依赖于父Activity而存在,不能本末倒置。
后来采用的方法是直接将demo Activity修改成Fragment
这里需要注意几点:
- 在Fragment里面的onCreate()函数内,是没有办法使用findViewById、setContentView这些函数的。因为Fragment本身并没有提供这些方法。于是我们只能通过onCreateView和onViewCreated来实现对显示的控制
- 布局通过inflate
将this替换为this.getActivity()
将findViewById替换为view.findViewById - onCreateView的作用是返回一个view
- onViewCreated的作用是进行Fragment的初始化动作
- 原本的demo中重载了onCreateOptionsMenu函数来显示选项卡,但Fragment中不支持它故将其删除,解决方法是将其放入MainActivity中重载
代码示例
Frd_Fragment
public class Frd_Fragment extends Fragment {
ContactModel mModel;
private SideBar mSideBar;
private ZSideBar mZSideBar;
private TextView mUserDialog;
private TouchableRecyclerView mRecyclerView;
private List<ContactModel.MembersEntity> mMembers = new ArrayList<>();
private CharacterParser characterParser;
private PinyinComparator pinyinComparator;
private ContactAdapter mAdapter;
private List<ContactModel.MembersEntity> mAllLists = new ArrayList<>();
private int mPermission;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.tab02, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getPermission();
initView(view);
}
private void initView(View view) {
characterParser = CharacterParser.getInstance();
pinyinComparator = new PinyinComparator();
mSideBar = (SideBar) view.findViewById(R.id.contact_sidebar);
mZSideBar = (ZSideBar) view.findViewById(R.id.contact_zsidebar);
mUserDialog = (TextView) view.findViewById(R.id.contact_dialog);
mRecyclerView = (TouchableRecyclerView) view.findViewById(R.id.contact_member);
mSideBar.setTextView(mUserDialog);
// fillData();
getNetData(0)