看到这个需求下面评论还挺多的,自己就写了个demo 但处理方式和下面这个方法不一样,下面的方法是在外部处理list 设置了三个数据源,觉得每次用这个适配器都需要这么设置数据源很麻烦,还要在外部处理点击,就把逻辑封装到适配器内部处理了 具体逻辑可以见第二种方式代码
第一种方式:
三个list:
- realList 真实list
- hideList 隐藏时的list
- openList 展开时的list
做法就是
- 判断适配器条目小于4(可任意)时,将适配器list设置为真实list
- 判断适配器条目大于4(可任意)时,将适配器hideList设置为真实list的前三个条目+查看更多;将适配器openList设置为真实list+收起
适配器代码
public class LuckyCodeAdapter extends RecyclerView.Adapter<LuckyCodeAdapter.LuckyCodeViewHolder> {
private Context context;
private List<String> list;
private boolean isHide;//隐藏
private boolean isOpen;//展开
public LuckyCodeAdapter(Context context) {
this.context = context;
}
@Override
public LuckyCodeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.item_tosanpup_lucky_code, parent, false);
return new LuckyCodeViewHolder(v);
}
@Override
public void onBindViewHolder(LuckyCodeViewHolder holder, final int position) {
holder.txtLuckyCode.setText(list.get(position));
if (hideOrShowCallBack != null) {
holder.txtLuckyCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (position == list.size() - 1) {
if (isOpen) {
hideOrShowCallBack.hide();
return;
}
if (isHide) {
hideOrShowCallBack.open();
return;
}
}
}
});
}
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
//隐藏
public void setHideList(List<String> newList) {
this.list = newList;
notifyDataSetChanged();
this.isHide = true;
this.isOpen = false;
}
//展开
public void setOpenList(List<String> openList) {
this.list = openList;
this.isOpen = true;
this.isHide = false;
notifyDataSetChanged();
}
//不需要隐藏/展开
public void setRealList(List<String> realList) {
this.list = realList;
notifyDataSetChanged();
this.isHide = false;
this.isOpen = false;
}
//清除数据
public void clearData() {
if (list != null) {
this.list.clear();
notifyDataSetChanged();
}
}
class LuckyCodeViewHolder extends RecyclerView.ViewHolder {
TextView txtLuckyCode;//幸运号码
public LuckyCodeViewHolder(View itemView) {
super(itemView);
txtLuckyCode = (TextView) itemView;
}
}
private HideOrShowCallBack hideOrShowCallBack;
public void setHideOrShowCallBack(HideOrShowCallBack hideOrShowCallBack) {
this.hideOrShowCallBack = hideOrShowCallBack;
}
public interface HideOrShowCallBack {
void hide();
void open();
}
}
//luckyList为真实list,判断是否需要隐藏
if (luckyList.size() > 4) {
luckyCodeHideList = new ArrayList<>();
luckyCodeOpenList = new ArrayList<>();
for (int i = 0; i < luckyList.size(); i++) {
luckyCodeOpenList.add(luckyList.get(i));
}
luckyCodeOpenList.add("收起");
for (int i = 0; i < 3; i++) {
luckyCodeHideList.add(luckyList.get(i));
}
luckyCodeHideList.add("查看更多");
luckyCodeAdapter.setHideList(luckyCodeHideList);
} else {
luckyCodeAdapter.setRealList(luckyList);
}
设置监听
luckyCodeAdapter.setHideOrShowCallBack(new LuckyCodeAdapter.HideOrShowCallBack() {
@Override
public void hide() {
luckyCodeAdapter.setHideList(luckyCodeHideList);
}
@Override
public void open() {
luckyCodeAdapter.setOpenList(luckyCodeOpenList);
}
});
第二种方式:
recyclerView = findViewById(R.id.recycler_view);
List<String> list = new ArrayList<>();
for (int i = 0; i < 30; i++) {
list.add("10000000" + i);
}
SeeMoreAdapter seeMoreAdapter = new SeeMoreAdapter(list);
recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
recyclerView.setAdapter(seeMoreAdapter);
class SeeMoreAdapter extends RecyclerView.Adapter<SeeMoreAdapter.SeeMoreViewHolder> {
private final static int TYPE_NORMAL = 0;//正常条目
private final static int TYPE_SEE_MORE = 1;//查看更多
private final static int TYPE_HIDE = 2;//收起
private List<String> mList;
private boolean mOpen = false;//是否是展开状态
SeeMoreAdapter(List<String> mList) {
this.mList = mList;
}
@NonNull
@Override
public SeeMoreViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_view, viewGroup, false);
return new SeeMoreViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SeeMoreViewHolder seeMoreViewHolder, int position) {
TextView textView = (TextView) seeMoreViewHolder.itemView;
if (getItemViewType(position) == TYPE_HIDE) {
textView.setText("收起");
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOpen = false;
notifyDataSetChanged();
}
});
} else if (getItemViewType(position) == TYPE_SEE_MORE) {
textView.setText("查看更多");
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOpen = true;
notifyDataSetChanged();
}
});
} else {
textView.setText(mList.get(position));
textView.setClickable(false);
}
}
@Override
public int getItemViewType(int position) {
if (mList.size() <= 4) {
return TYPE_NORMAL;
}
if (mOpen) {
if (position == mList.size()) {
return TYPE_HIDE;
} else {
return TYPE_NORMAL;
}
} else {
if (position == 3) {
return TYPE_SEE_MORE;
} else {
return TYPE_NORMAL;
}
}
}
@Override
public int getItemCount() {
if (mList == null || mList.size() == 0) {
return 0;
}
if (mList.size() > 4) {
//若现在是展开状态 条目数量需要+1 "收起"条目
if (mOpen) {
return mList.size() + 1;
} else {
return 4;
}
} else {
return mList.size();
}
}
class SeeMoreViewHolder extends RecyclerView.ViewHolder {
public SeeMoreViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}