可展开并收起的RecycleView
思路:
利用RecycleView Adatper的getItemCount实现显示条目的变化,并且使用getItemViewType来实现底部栏与普通栏的变化
代码如下,由于时间比较紧,没有优化,但是功能是可以实现的。
public class ExpendRecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = "ExpendRecycleAdapter";
private List<ReportsAndBeans> reportAndBeansList;
private List<BeanInfo> beanInfoList;
private static final int DEFAULT_SIZE = 2; //小于等于2时,不用展开,大于2时展开。
private int currentState;
public ExpendRecycleAdapter adapter;
private static final int NO_MORE_TWO = 0x0001;
public static final int NEED_EXPEND = 0x0002;
public static final int NEED_COMPRESS = 0x0003;
public ExpendRecycleAdapter(List<ReportsAndBeans> ReportAndBeans, List<BeanInfo> beanInfos) {
this.reportAndBeansList = ReportAndBeans;
this.beanInfoList = beanInfos;
judgeState(reportAndBeansList.size());
adapter = this;
}
private void judgeState(int dataSize){
if (dataSize > DEFAULT_SIZE) {
currentState = NEED_EXPEND; //默认不展开
} else
currentState = NO_MORE_TWO;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == R.layout.report_beans_item) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.report_beans_item, parent, false);
NormalViewHolder viewHolder = new NormalViewHolder(itemView);
return viewHolder;
} else {
View footView = LayoutInflater.from(parent.getContext()).inflate(R.layout.report_expend_foot_view, parent, false);
FootViewHolder viewHolder = new FootViewHolder(footView);
return viewHolder;
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder.getItemViewType() == R.layout.report_beans_item) {
if (beanInfoList.size() ==0)
return;
((NormalViewHolder) holder).bindData(beanInfoList.get(position), reportAndBeansList.get(position));
} else {
FootViewHolder footViewHolder = (FootViewHolder) holder;
footViewHolder.changeState(currentState);
footViewHolder.setListener(new FootViewHolder.onBottomClickListener() {
@Override
public void onBottomClick() {
if (currentState == NEED_EXPEND) {
currentState = NEED_COMPRESS;
footViewHolder.changeState(currentState);
} else {
currentState = NEED_EXPEND;
footViewHolder.changeState(currentState);
}
notifyDataSetChanged();
}
});
}
}
@Override
public int getItemCount() {
int needShowCount;
if (currentState == NEED_EXPEND) {
needShowCount = DEFAULT_SIZE + 1; //2加上底部View
} else if (currentState == NO_MORE_TWO) {
needShowCount = reportAndBeansList.size();
} else
needShowCount = reportAndBeansList.size() + 1; //list大小加上底部view
return needShowCount;
}
@Override
public int getItemViewType(int position) {
if (currentState == NO_MORE_TWO) {
return R.layout.report_beans_item;
} else if (currentState == NEED_EXPEND) {
if (position < DEFAULT_SIZE) {
return R.layout.report_beans_item;
} else
return R.layout.report_expend_foot_view;
}
if (position < reportAndBeansList.size()) {
return R.layout.report_beans_item;
} else
return R.layout.report_expend_foot_view;
}
public static class NormalViewHolder extends RecyclerView.ViewHolder {
private TextView reportBeansItemName;
private TextView reportBeansItemRowWeight;
public NormalViewHolder(View itemView) {
super(itemView);
reportBeansItemRowWeight = itemView.findViewById(R.id.report_beans_item_row_weight);
reportBeansItemName = itemView.findViewById(R.id.report_beans_item_name);
}
public void bindData(BeanInfo beanInfo, ReportsAndBeans reportsAndBeans) {
reportBeansItemRowWeight.setText(String.valueOf(reportsAndBeans.getBeanWight()));
reportBeansItemName.setText(beanInfo.getBeanName());
}
}
public static class FootViewHolder extends RecyclerView.ViewHolder {
private TextView mTextView;
public FootViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.textView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "onClick: ");
if (listener != null) {
listener.onBottomClick();
}
}
});
}
public void changeState(int currentState) {
if (currentState == NEED_COMPRESS) {
mTextView.setText("收起");
} else
mTextView.setText("展开");
}
private onBottomClickListener listener;
public interface onBottomClickListener {
void onBottomClick();
}
public void setListener(onBottomClickListener listener) {
this.listener = listener;
}
}
public void myNotifyDataSetChanged(int dataSize){
judgeState(dataSize);
notifyDataSetChanged();
}
}
转载请注明。