您的位置:首页 > 其它

使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐