使用RecyclerView实现类似QQ的练习人UserName,Nick以及Avatar的分页下载
2016-10-09 22:51
435 查看
扯淡
本片文章的主要内容是:在Activity的Layout中加入RecyclerView来存放一行行的联系人信息,使用封装的Okhttp来完成头像的下载,采用二级存储方式来存放下载的头像,另外在Layout中最外层使用SwipeRefreshLayout来实现下拉是出现一个圈圈最终就是这个样子啦
第一步
RecyclerView当然是要先写适配器了,这里ViewHolder是有两个的//这就是联系人项对应的ContactViewHolder,里面三个控件,头像,账号,昵称 class ContactViewHolder extends RecyclerView.ViewHolder { ImageView ivAvatar; TextView tvUserName,tvNick; public ContactViewHolder(View itemView) { super(itemView); ivAvatar = (ImageView) itemView.findViewById(R.id.ivAvatar); tvUserName = (TextView) itemView.findViewById(R.id.tvUserName); tvNick = (TextView) itemView.findViewById(R.id.tvNick); } } //这个FooterViewHolder是最下面的一个为了友好显示而添加的只含有一个TextView的页脚项吧 class FooterViewHolder extends RecyclerView.ViewHolder { TextView tvFooter; public FooterViewHolder(View itemView) { super(itemView); tvFooter = (TextView) itemView.findViewById(R.id.tvFooter); } }
第二步
当然是写适配器啦,有点多,别急,骚年,看我解释给你听class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { Context context; ArrayList<UserAvatar> contactList;//UserAvatar是存放数据的类里面有ContactViewHolder中需要的数据 String footer;//这个东西就是页脚的文字,展示的是“正在加载...”或者“没有更多加载” RecyclerView parent; static final int TYPE_ITEM = 0;//对应ViewHolder的两种类型 static final int TYPE_FOOTER = 1; //构造器,很明显吧,嘿嘿 public MyAdapter(Context context, ArrayList<UserAvatar> contactList) { this.context = context; this.contactList = contactList; } boolean more;//看是否有更多的数据 public boolean isMore() { return more; } public void setMore(boolean more) { this.more = more; } //设置页脚的文字用的方法 public void setFooter(String footer) { this.footer = footer; notifyDataSetChanged(); } //初始化数据,并提醒数据发生改变 public void initContactList(ArrayList<UserAvatar> contactList) { this.contactList.clear(); this.contactList.addAll(contactList); notifyDataSetChanged(); } //添加数据,并提醒数据发生改变 public void addContactList(ArrayList<UserAvatar> contactList) { this.contactList.addAll(contactList); notifyDataSetChanged(); } //熟悉的地方来了 ,这就是onCreateViewHolder,里面只是判断一个Item的类型以便生成相应的对象 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { this.parent = (RecyclerView) parent; RecyclerView.ViewHolder holder = null; View layout = null; switch (viewType) { case TYPE_FOOTER: layout = LayoutInflater.from(context).inflate(R.layout.item_footer, parent, false); holder = new FooterViewHolder(layout); break; case TYPE_ITEM: layout = LayoutInflater.from(context).inflate(R.layout.item_contact, parent, false); holder = new ContactViewHolder(layout); break; } return holder; } //onBindViewHolder绑定数据,同样实现判断Item的类型,然后将数据和View绑定 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (getItemViewType(position) == TYPE_FOOTER) { ((FooterViewHolder) holder).tvFooter.setText(footer); return; } ContactViewHolder contactViewHolder = (ContactViewHolder) holder; UserAvatar user = contactList.get(position); contactViewHolder.tvUserName.setText("账号:" + user.getMUserName()); contactViewHolder.tvNick.setText("昵称:" + user.getMUserNick()); //这个使用的封装的图片下载工具,采用二级存储 ImageLoader.build() .url(I.SERVER_URL) .addParam(I.KEY_REQUEST, I.REQUEST_DOWNLOAD_AVATAR) .addParam(I.NAME_OR_HXID, user.getMUserName()) .addParam(I.AVATAR_TYPE, "user_avatar") .width(80) .height(80) .defaultPicture(R.drawable.default_face) .imageView(contactViewHolder.ivAvatar) .listener(parent) .setDragging(mNewState != RecyclerView.SCROLL_STATE_DRAGGING) .showImage(context); } //这个地方返回RecyclerView一共多少个Item,+1是因为 多了一个页脚那个东西 @Override public int getItemCount() { return contactList == null ? 0 : contactList.size() + 1; } //在onCreateViewHolder方法中调用,进行类型判断,当然绑定数据也用到了 @Override public int getItemViewType(int position) { if (position == getItemCount() - 1) { return TYPE_FOOTER; } else { return TYPE_ITEM; } } }
回头看看我们做了什么,发现我们只是写了适配器而已,当然适配器是最重要的,接下来让我们实现下拉和上拉刷新的功能
第三步
这里只需要给SwipeRefreshLayout和RecyclerView设置监听,然后去网络请求下载数据,传给适配器,让它去展示内容,上代码啦!“`java
private void setListener() {
setPullUpListener();//给RecyclerView设置OnScrollListener监听
setPUllDownLi
ab6a
stener();//给SwipeRefreshLayout设置OnRefreshListener监听
}
private void setPUllDownListener() { msrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { msrl.setRefreshing(true); msrl.setEnabled(true); mtvHint.setVisibility(View.VISIBLE);//这个是我在最上面放了一个TextView"刷新中..." mPageId = 1; downloadContactList(ACTION_PULL_DOWN, mPageId); } }); } private void setPullUpListener() { mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { int lastPosition; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); mNewState = newState;//记住滑动的状态以便实现但松手的时候图片才加载,不放手图片不加载 lastPosition = mLinearLayoutManager.findLastVisibleItemPosition();//这里获得当前RecyclerView最后一个Item的Position以便判断是否要加载更多 if (lastPosition >= mContactAdapter.getItemCount() - 1 && newState == RecyclerView.SCROLL_STATE_IDLE && mContactAdapter.isMore()) { mPageId++; downloadContactList(ACTION_PULL_UP, mPageId); } if (newState != RecyclerView.SCROLL_STATE_DRAGGING) { mContactAdapter.notifyDataSetChanged(); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastPosition = mLinearLayoutManager.findLastVisibleItemPosition(); } }); }
还有一个下载数据的方法downloadContactList
//这里面使用封装的Okhttp去进行网络请求 private void downloadContactList(final int action, int pageId) { final OkHttpUtils<Result> utils = new OkHttpUtils<>(); utils.url(I.SERVER_URL) .addParam(I.KEY_REQUEST, I.REQUEST_DOWNLOAD_CONTACT_PAGE_LIST) .addParam(I.Contact.USER_NAME, USER_NAME) .addParam(I.PAGE_ID, pageId + "") .addParam(I.PAGE_SIZE, PAGE_SIZE + "") .targetClass(Result.class) .execute(new OkHttpUtils.OnCompleteListener<Result>() { @Override public void onSuccess(Result result) { if (result.getRetCode() != 0) { return; } String json = result.getRetData().toString(); Gson gson = new Gson(); Map map = gson.fromJson(json, Map.class); json = map.get("pageData").toString(); UserAvatar[] users = gson.fromJson(json, UserAvatar[].class); mContactAdapter.setMore(users != null && users.length > 0); if (!mContactAdapter.isMore()) { if (action == ACTION_PULL_UP) { mContactAdapter.setFooter("没有更多加载"); } return; } ArrayList<UserAvatar> contactList = utils.array2List(users); switch (action) { case ACTION_DOWN: mContactAdapter.initContactList(contactList); mContactAdapter.setFooter("加载更多"); break; case ACTION_PULL_DOWN: mContactAdapter.initContactList(contactList); mContactAdapter.setFooter("加载更多"); msrl.setRefreshing(false); mtvHint.setVisibility(View.GONE); ImageLoader.release(); break; case ACTION_PULL_UP: mContactAdapter.addContactList(contactList); break; } } @Override public void onError(String error) { } }); }
到这里就完了,88
相关文章推荐
- RecyclerView实现上拉分页加载以及下拉刷新
- 使用RecyclerView实现多行水平分页的GridView效果和ViewPager效果
- Android中使用RecyclerView + SnapHelper实现类似ViewPager效果
- Android中使用RecyclerView + SnapHelper实现类似ViewPager效果
- android开发之&使用ViewPager加gridView实现菜单按钮分页滑动(类似QQ表情选择翻页效果)
- viewpager和以及在viewpager中使用FragmentPagerAdapter实现分页
- Android 中使用 RecyclerView + SnapHelper 实现类似 ViewPager 效果
- viewpager和以及在viewpager中使用FragmentPagerAdapter实现分页
- 使用ViewPager和RecyclerView实现水平分页功能
- 使用RecyclerView实现滑动添加、滑动删除,以及瀑布流、ListView、GridView的转换
- recycleView的使用以及PullableRecyclerView实现了上拉加载下拉刷新的效果
- Android应用中使用ViewPager实现类似QQ的界面切换效果
- Android适配器之 V7扩展包 RecyclerView 的使用以及万能适配器的封装实现
- Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新
- Android中使用RecyclerView + SnapHelper实现类似ViewPager效果
- RecyclerView中使用CheckBox勾选混乱问题解决以及单选功能的实现
- RecyclerView的简单使用以及实现瀑布流效果
- Android 中使用 RecyclerView + SnapHelper 实现类似 ViewPager 效果
- recyclerView 实现类似支付宝应用页面 以及顶部增加viewPager轮播
- 使用ViewPager实现几个界面的切换,类似QQ