用Recyclerview實現列表分組、下拉重新整理以及上拉載入--原始碼
阿新 • • 發佈:2018-12-30
這裡放上之前整理的一篇文章的完整原始碼,因為是從專案中抽取出來的,也沒有單獨再寫一個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);
}
}
}