用Recyclerview实现列表分组、下拉刷新以及上拉加载--源码

这里放上之前整理的一篇文章的完整源码,因为是从项目中抽取出来的,也没有单独再写一个demo,希望需要的小伙伴能结合之前写的一篇文章,理解实现原理,而不要简单的想要直接copy拿来用,这里是博文地址:

用Recyclerview实现列表分组、下拉刷新以及上拉加载更多


import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.emiage.hdlc.R;
import com.emiage.util.GetArchType;
import com.emipian.activity.traffic.MeetingDetailActivity;
import com.emipian.activity.traffic.MeetingListActivity;
import com.emipian.activity.traffic.MeetingRequestActivity;
import com.emipian.adapter.MomentsRecyclerViewAdapter;
import com.emipian.app.EmipianApplication;
import com.emipian.entity.traffic.MeetingInfo;
import com.emipian.provider.Communication;
import com.emipian.task.DBManager;
import com.emipian.util.TimeUtil;
import com.emipian.view.CustomToast;
import com.emipian.view.HDMeetingPhoto.CircularImageView;
import com.manager.task.finalclass.ExtraName;
import com.wdliveuc.android.ActiveMeeting7.ActiveMeeting7Activity;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import cn.com.iactive.utils.StartMeeting;

/**
 * Created by Administrator on 2016/6/17 0017.
 */
public class MeetingListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final int VIEW_TYPE_TITLE = 0X01;
    private static final int VIEW_TYPE_ITEM = 0X02;
    private static final int VIEW_TYPE_FOOTER = 0X04;

    private static final int FLAG_DOING = 0X00;
    private static final int FLAG_INCOMING = 0X01;
    private static final int FLAG_END = 0X02;
    private static final int FLAG_CLOSE = 0X03;

    private List<MeetingInfo> mMeetingList = new ArrayList<>();
    private Context mContext;
    private FooterViewHolder mFooterViewHolder;

    private MyItemClickListener mItemClickListener;
    private long offsetStartTime = 0;

    public void setItemClickListener(MyItemClickListener listener) {
        this.mItemClickListener = listener;
    }

    public interface MyItemClickListener {
        void onItemClick(View view, int position);
    }

    public MeetingListAdapter(Context context) {
        super();
        this.mContext = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = null;
        switch (viewType) {
            case VIEW_TYPE_TITLE:
                view = LayoutInflater.from(mContext).inflate(R.layout.meeting_recycler_view_title, parent, false);
                return new TitleViewHolder(view);

            case VIEW_TYPE_ITEM:
                view = LayoutInflater.from(mContext).inflate(R.layout.meeting_recycler_view_item, parent, false);
                return new ItemViewHolder(view);

            case VIEW_TYPE_FOOTER:
                view = LayoutInflater.from(mContext).inflate(R.layout.moment_footview, parent, false);
                return mFooterViewHolder = new FooterViewHolder(view);
        }
        return null;
    }

    public void setList(List<MeetingInfo> list) {
        if (list != null) {
            this.mMeetingList = list;
            sortList();
            notifyDataSetChanged();
        }
    }

    private void sortList() {
        List<MeetingInfo> tempList = mMeetingList;
        MeetingInfo groupInfo = null;//分组数据

        int[] flags = new int[]{FLAG_DOING, FLAG_INCOMING, FLAG_END, FLAG_CLOSE};
        for (int j = 0; j < flags.length; j++) {
            for (int i = 0; i < tempList.size(); i++) {
                MeetingInfo info = tempList.get(i);
                if (info.getFlag() == flags[j] && !containsFlag(100 + flags[j])) {
                    groupInfo = new MeetingInfo();
                    groupInfo.setFlag(100 + flags[j]);
                    mMeetingList.add(i, groupInfo);
                    break;
                }
            }
        }
    }

    private boolean containsFlag(int flag) {
        boolean contains = false;
        for (int i = 0; i < mMeetingList.size(); i++) {
            if (mMeetingList.get(i).getFlag() == flag) {
                contains = true;
                break;
            }
        }

        return contains;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ItemViewHolder) {
            bindItemHolder((ItemViewHolder) holder, position);
        } else if (holder instanceof TitleViewHolder)
            bindTitleHolder((TitleViewHolder) holder, position);
        else if (holder instanceof FooterViewHolder) {
            ((FooterViewHolder) holder).ll_root.setVisibility(View.VISIBLE);
        }
    }

    private void bindTitleHolder(TitleViewHolder holder, int position) {
        final MeetingInfo info = mMeetingList.get(position);
        TitleViewHolder titleViewHolder = holder;
        if (info.getFlag() == 100 + FLAG_DOING) {
            titleViewHolder.tv_group_title.setText(R.string.hd_meeting_status_doing);
            titleViewHolder.tv_group_title.setTextColor(mContext.getResources()
                    .getColor(R.color.hd_meeting_group_title_doing));
            Drawable drawable = mContext.getResources().getDrawable(R.drawable.icon_meeting_doing_group);
            drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
            titleViewHolder.tv_group_title.setCompoundDrawables(drawable, null, null, null);
        } else if (info.getFlag() == 100 + FLAG_INCOMING) {
            titleViewHolder.tv_group_title.setText(R.string.hd_meeting_status_incoming);
            titleViewHolder.tv_group_title.setTextColor(mContext.getResources()
                    .getColor(R.color.hd_meeting_group_title_incoming));
            Drawable drawable = mContext.getResources().getDrawable(R.drawable.icon_meeting_incoming_group);
            drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
            titleViewHolder.tv_group_title.setCompoundDrawables(drawable, null, null, null);
        } else if (info.getFlag() == 100 + FLAG_END) {
            titleViewHolder.tv_group_title.setText(R.string.hd_meeting_status_end);
            titleViewHolder.tv_group_title.setTextColor(mContext.getResources()
                    .getColor(R.color.hd_meeting_group_title_end));
            Drawable drawable = mContext.getResources().getDrawable(R.drawable.icon_meeting_end_group);
            drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
            titleViewHolder.tv_group_title.setCompoundDrawables(drawable, null, null, null);
        } else if (info.getFlag() == 100 + FLAG_CLOSE) {
            titleViewHolder.tv_group_title.setText(R.string.hd_meeting_status_closed);
            titleViewHolder.tv_group_title.setTextColor(mContext.getResources()
                    .getColor(R.color.hd_meeting_group_title_close));
            Drawable drawable = mContext.getResources().getDrawable(R.drawable.icon_meeting_close_group);
            drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
            titleViewHolder.tv_group_title.setCompoundDrawables(drawable, null, null, null);
        }
    }

    private void bindItemHolder(final ItemViewHolder holder, int position) {
        final MeetingInfo info = mMeetingList.get(position);
        holder.title_tv.setText(info.getMeetingname());
        holder.label2_tv.setText(info.getCount() + mContext.getString(R.string.hd_meeting_member_count));

        if (info.getFlag() == FLAG_INCOMING) {
            offsetStartTime = info.getStarttime() - System.currentTimeMillis();
            if (offsetStartTime > 30 * 60 * 1000) {
                holder.label1_tv.setText(TimeUtil.formatTime(info.getStarttime(),
                        TimeUtil.TYPE_AUTO) + mContext.getString(R.string.hd_meeting_start_time_buffer));
            } else if (offsetStartTime <= 30 * 60 * 1000 && offsetStartTime > 60 * 1000) {
                holder.label1_tv.setText(mContext.getString(R.string.hd_meeting_start_time_pre_buffer) + TimeUtil.Meetingformat(info.getStarttime()));
            } else if (offsetStartTime <= 60 * 1000 && offsetStartTime > 0) {
                holder.label1_tv.setText(R.string.hd_meeting_start_time);
            } else if (offsetStartTime <= 0) {
                holder.label1_tv.setText(TimeUtil.formatTime(info.getStarttime(),
                        TimeUtil.TYPE_AUTO) + mContext.getString(R.string.hd_meeting_start_time_buffer));
            }
        } else {
            holder.label1_tv.setText(TimeUtil.formatTime(info.getStarttime(),
                    TimeUtil.TYPE_AUTO) + mContext.getString(R.string.hd_meeting_start_time_buffer));
        }

        ArrayList<Bitmap> bitmaps = null;
        if (info.getUsers() != null && info.getUsers().size() > 0) {
            bitmaps = new ArrayList<Bitmap>();
            if (info.getUsers().size() > 5) {
                for (int i = 0; i < 5; i++) {
                    Bitmap bitmap = EmipianApplication.imageLoader.
                            getDisplayImage("", info.getUsers().get(i).userid);
                    if (bitmap != null) {
                        bitmaps.add(bitmap);
                    } else {
                        bitmaps.add(BitmapFactory.decodeResource(EmipianApplication.
                                getContext().getResources(), R.drawable.icon_profile_photo_def));
                    }
                }
            } else {
                for (int i = 0; i < info.getUsers().size(); i++) {
                    Bitmap bitmap = EmipianApplication.imageLoader.
                            getDisplayImage("", info.getUsers().get(i).userid);
                    if (bitmap != null) {
                        bitmaps.add(bitmap);
                    } else {
                        bitmaps.add(BitmapFactory.decodeResource(EmipianApplication.
                                getContext().getResources(), R.drawable.icon_profile_photo_def));
                    }
                }
            }

        }
        if (bitmaps!=null){
            holder.icon_iv.setImageBitmaps(bitmaps);
        }


        /**
         * flag:0-正在开会,1-将要开会,2-会议结束,3-关闭会议
         */
        final int flag = info.getFlag();
        switch (flag) {
            case FLAG_DOING:
                holder.option_btn.setText(R.string.hd_meeting_option_add);
                holder.option_btn.setEnabled(true);
                holder.option_btn.setBackgroundResource(R.drawable.bg_btn_meeting_add);
                holder.option_btn.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                        mContext.getResources().getDimension(R.dimen.big_text_size));
                holder.option_btn.setTextColor(mContext.getResources()
                        .getColor(R.color.text_blue));
                break;

            case FLAG_INCOMING:
                holder.option_btn.setText(R.string.hd_meeting_option_add);
                holder.option_btn.setEnabled(true);
                holder.option_btn.setBackgroundResource(R.drawable.bg_btn_meeting_add);
                holder.option_btn.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                        mContext.getResources().getDimension(R.dimen.big_text_size));
                holder.option_btn.setTextColor(mContext.getResources()
                        .getColor(R.color.text_blue));
                break;

            case FLAG_END:
                if (DBManager.getLatestUserId().equals(info.getHostuserid())) {
                    holder.option_btn.setText(R.string.hd_meeting_option_end);
                    holder.option_btn.setEnabled(true);
                    holder.option_btn.setBackgroundResource(R.drawable.bg_btn_meeting_end);
                    holder.option_btn.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                            mContext.getResources().getDimensionPixelOffset(R.dimen.big_text_size));
                    holder.option_btn.setTextColor(mContext.getResources()
                            .getColor(R.color.hd_meeting_group_title_end));
                } else {
                    holder.option_btn.setText(R.string.hd_meeting_status_tips_end);
                    holder.option_btn.setEnabled(false);
                    holder.option_btn.setBackgroundResource(R.drawable.bg_btn_meeting_add);
                    holder.option_btn.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                            mContext.getResources().getDimension(R.dimen.small_text_size));
                    holder.option_btn.setTextColor(mContext.getResources()
                            .getColor(R.color.text_blue));
                }
                break;

            case FLAG_CLOSE:
                holder.option_btn.setText(R.string.hd_meeting_option_create_again);
                holder.option_btn.setEnabled(true);
                holder.option_btn.setBackgroundResource(R.drawable.bg_btn_meeting_add);
                holder.option_btn.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                        mContext.getResources().getDimension(R.dimen.big_text_size));
                holder.option_btn.setTextColor(mContext.getResources()
                        .getColor(R.color.text_blue));
                break;
        }

        holder.option_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (flag == 0) {
                    if (GetArchType.checkIfCPUx64()) {
                        CustomToast.makeText(mContext, mContext.getString(R.string.hd_meeting_system_type_64), Toast.LENGTH_SHORT).show();
                    } else {
                        startMeetingActivity(info);
                    }
                } else if (flag == 1) {
                    long offset = info.getStarttime() - System.currentTimeMillis();
                    if (offset <= 5 * 60 * 1000) {
                        startMeetingActivity(info);
                    } else if (offset > 5 * 60 * 1000) {
                        CustomToast.makeText(mContext, mContext.getString(R.string.hd_meeting_status_tips_unstart), Toast.LENGTH_SHORT).show();
                    }
                } else if (flag == 2) {
                    //调用关闭接口
                    Communication.closemeeting((MeetingListActivity) mContext, info.getMeetingid());
                } else if (flag == 3) {
                    startCreateMeetingActivity(info);
                }
            }
        });
    }

    private void startCreateMeetingActivity(MeetingInfo info) {
        Intent intent = new Intent(mContext, MeetingRequestActivity.class);
        intent.putExtra(ExtraName.MEETING_RECREATE, info);
        MeetingListActivity meetingListActivity = (MeetingListActivity) mContext;
        meetingListActivity.startActivityForResult(intent, meetingListActivity.REQUEST_CODE_MEETING_REQUEST);
    }

    private void startMeetingActivity(MeetingInfo info) {
        MeetingDetailActivity.enterMeeting(mContext, info);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        return mMeetingList.size() + 1;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == getItemCount() - 1) {
            return VIEW_TYPE_FOOTER;
        } else if (!mMeetingList.isEmpty()) {
            MeetingInfo info = mMeetingList.get(position);
            int flag = info.getFlag();
            if (flag == 100 || flag == 101 || flag == 102 || flag == 103) {
                return VIEW_TYPE_TITLE;
            } else {
                return VIEW_TYPE_ITEM;
            }
        }
        return VIEW_TYPE_FOOTER;
    }

    public void setLoadingStatus(int status) {
        if (mFooterViewHolder == null) {
            return;
        }
        switch (status) {
            case MomentsRecyclerViewAdapter.LOAD_STATUS_LOADING:// loading
                mFooterViewHolder.ll_root.setVisibility(View.VISIBLE);
                mFooterViewHolder.progressBar.setVisibility(View.VISIBLE);
                mFooterViewHolder.tv_loadMore.setText(mContext.getString(R.string.progress_loading));
                break;

            case MomentsRecyclerViewAdapter.LOAD_STATUS_COMPLETED:// load finish
                mFooterViewHolder.ll_root.setVisibility(View.GONE);
                break;

            case MomentsRecyclerViewAdapter.LOAD_STATUS_NO_MORE_DATA:// no more data to loaded
                mFooterViewHolder.ll_root.setVisibility(View.VISIBLE);
                mFooterViewHolder.progressBar.setVisibility(View.GONE);
                mFooterViewHolder.tv_loadMore.setText(mContext.getString(R.string.progress_loading_no_more));
                break;

            default:
                break;
        }
    }


    static class TitleViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_title)
        TextView tv_group_title;

        public TitleViewHolder(View view) {
            super(view);

            ButterKnife.bind(this, view);
        }
    }

    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        @BindView(R.id.item_icon_iv)
        CircularImageView icon_iv;

        @BindView(R.id.item_metting_title)
        TextView title_tv;

        @BindView(R.id.item_metting_label_1)
        TextView label1_tv;

        @BindView(R.id.item_metting_label_2)
        TextView label2_tv;

        @BindView(R.id.item_metting_add_btn)
        Button option_btn;

        public ItemViewHolder(View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (mItemClickListener != null) {
                mItemClickListener.onItemClick(v, getLayoutPosition());
            }
        }
    }

    static class FooterViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.footer_root_view)
        LinearLayout ll_root;

        @BindView(R.id.tv_footview)
        TextView tv_loadMore;

        @BindView(R.id.pb_footview)
        ProgressBar progressBar;

        public FooterViewHolder(View view) {
            super(view);

            ButterKnife.bind(this, view);
        }
    }
}
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值