使用RecyclerView实现类似QQ的练习人UserName,Nick以及Avatar的分页下载

来源:互联网 发布:时间校正软件 编辑:程序博客网 时间:2024/05/29 06:43

扯淡

本片文章的主要内容是:在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监听
setPUllDownListener();//给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

0 0