1. 程式人生 > >用Recyclerview實現列表分組、下拉重新整理以及上拉載入--原始碼

用Recyclerview實現列表分組、下拉重新整理以及上拉載入--原始碼

這裡放上之前整理的一篇文章的完整原始碼,因為是從專案中抽取出來的,也沒有單獨再寫一個demo,希望需要的小夥伴能結合之前寫的一篇文章,理解實現原理,而不要簡單的想要直接copy拿來用,這裡是博文地址:


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); } } }