比較喜歡先上圖
Android 原生ExpandableListView 是繼承ListView繪制罩息,可直接實現(xiàn)此UI粉捻,自行搜索使用
無論何種實現(xiàn)幌衣,均需我們手動轉(zhuǎn)化數(shù)據(jù)源
實現(xiàn)方式簡單屿附,代碼未優(yōu)化郎逃,無擴(kuò)展性,性能未知挺份,勿噴
最下方有源碼
方案一褒翰,加載所有數(shù)據(jù)通過控制itemview高度實現(xiàn)假折疊
平級數(shù)據(jù),數(shù)據(jù)需要轉(zhuǎn)化我們需要的
List<TestBean> list = new ArrayList<>();
list.add(new TestBean("這是數(shù)據(jù) 1", 1, true, true));
list.add(new TestBean("這是數(shù)據(jù) 1 子項", 1));
list.add(new TestBean("這是數(shù)據(jù) 1 子項", 1));
list.add(new TestBean("這是數(shù)據(jù) 1 子項", 1));
list.add(new TestBean("這是數(shù)據(jù) 1 子項", 1));
list.add(new TestBean("這是數(shù)據(jù) 2", 2, true, true));
list.add(new TestBean("這是數(shù)據(jù) 2 子項", 2));
list.add(new TestBean("這是數(shù)據(jù) 2 子項", 2));
list.add(new TestBean("這是數(shù)據(jù) 2 子項", 2));
list.add(new TestBean("這是數(shù)據(jù) 3", 3, true, true));
list.add(new TestBean("這是數(shù)據(jù) 3 子項", 3));
list.add(new TestBean("這是數(shù)據(jù) 3 子項", 3));
list.add(new TestBean("這是數(shù)據(jù) 4", 4, true, false));
list.add(new TestBean("這是數(shù)據(jù) 5", 5, true, true));
list.add(new TestBean("這是數(shù)據(jù) 5 子項", 5));
list.add(new TestBean("這是數(shù)據(jù) 5 子項", 5));
list.add(new TestBean("這是數(shù)據(jù) 5 子項", 5));
list.add(new TestBean("這是數(shù)據(jù) 6", 6, true, true));
list.add(new TestBean("這是數(shù)據(jù) 6 子項", 6));
list.add(new TestBean("這是數(shù)據(jù) 6 子項", 6));
list.add(new TestBean("這是數(shù)據(jù) 6 子項", 6));
list.add(new TestBean("這是數(shù)據(jù) 6 子項", 6));
list.add(new TestBean("這是數(shù)據(jù) 6 子項", 6));
adapter實現(xiàn)
public class RecyclerViewFoldingAdapter extends RecyclerView.Adapter<RecyclerViewFoldingAdapter.FoldingViewHolder> {
private Context context;
private List<TestBean> list;
public RecyclerViewFoldingAdapter(Context context, List<TestBean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public RecyclerViewFoldingAdapter.FoldingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
return new FoldingViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerViewFoldingAdapter.FoldingViewHolder viewHolder, int position) {
final TestBean testBean = list.get(position);
ViewGroup.LayoutParams layoutParams = viewHolder.itemView.getLayoutParams();
if (testBean.isMain()){
viewHolder.textView.setText(testBean.getId() + " " + testBean.getTitle());
if (testBean.isHasChild()){
viewHolder.imageView.setVisibility(View.VISIBLE);
} else {
viewHolder.imageView.setVisibility(View.GONE);
}
if (testBean.isFolding()){
viewHolder.imageView.setImageResource(R.drawable.down);
} else {
viewHolder.imageView.setImageResource(R.drawable.up);
}
layoutParams.height = TestBean.dp2px(context, 50);
} else {
viewHolder.textView.setText(" " + testBean.getTitle());
if (testBean.isFolding()){
layoutParams.height = 0;
} else {
layoutParams.height = TestBean.dp2px(context, 50);
}
viewHolder.imageView.setVisibility(View.GONE);
}
viewHolder.itemView.setLayoutParams(layoutParams);
viewHolder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testBean.setFolding(!testBean.isFolding());
changeItem(testBean);
notifyDataSetChanged();
}
});
}
private void changeItem(TestBean testBean) {
for (TestBean bean : list) {
if (testBean.getId() == bean.getId() && !bean.isMain()){
bean.setFolding(testBean.isFolding());
}
}
}
@Override
public int getItemCount() {
return list.size();
}
static class FoldingViewHolder extends RecyclerView.ViewHolder{
TextView textView;
ImageView imageView;
public FoldingViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv);
imageView = itemView.findViewById(R.id.iv);
}
}
}
方案二匀泊,通過數(shù)據(jù)源 list.add和remove方式更新到adapter中實現(xiàn)假折疊
數(shù)據(jù)源优训,list中bean帶有自己List<bean> beans
List<TestBean> list = new ArrayList<>();
TestBean bean1 = new TestBean("這是數(shù)據(jù) 1", 1,true, true);
list.add(bean1);
bean1.getBeans().add(new TestBean("這是數(shù)據(jù) 1 子項"));
bean1.getBeans().add(new TestBean("這是數(shù)據(jù) 1 子項"));
bean1.getBeans().add(new TestBean("這是數(shù)據(jù) 1 子項"));
bean1.getBeans().add(new TestBean("這是數(shù)據(jù) 1 子項"));
TestBean bean2 = new TestBean("這是數(shù)據(jù) 2", 2,true, true);
list.add(bean2);
bean2.getBeans().add(new TestBean("這是數(shù)據(jù) 2 子項"));
bean2.getBeans().add(new TestBean("這是數(shù)據(jù) 2 子項"));
bean2.getBeans().add(new TestBean("這是數(shù)據(jù) 2 子項"));
TestBean bean3 = new TestBean("這是數(shù)據(jù) 3", 3,true, true);
list.add(bean3);
bean3.getBeans().add(new TestBean("這是數(shù)據(jù) 3 子項"));
bean3.getBeans().add(new TestBean("這是數(shù)據(jù) 3 子項"));
list.add(new TestBean("這是數(shù)據(jù) 4", 4, true, false));
TestBean bean5 = new TestBean("這是數(shù)據(jù) 5", 5,true, true);
list.add(bean5);
bean5.getBeans().add(new TestBean("這是數(shù)據(jù) 5 子項"));
bean5.getBeans().add(new TestBean("這是數(shù)據(jù) 5 子項"));
bean5.getBeans().add(new TestBean("這是數(shù)據(jù) 5 子項"));
TestBean bean6 = new TestBean("這是數(shù)據(jù) 6", 6, true, true);
list.add(bean6);
bean6.getBeans().add(new TestBean("這是數(shù)據(jù) 6 子項"));
bean6.getBeans().add(new TestBean("這是數(shù)據(jù) 6 子項"));
bean6.getBeans().add(new TestBean("這是數(shù)據(jù) 6 子項"));
bean6.getBeans().add(new TestBean("這是數(shù)據(jù) 6 子項"));
bean6.getBeans().add(new TestBean("這是數(shù)據(jù) 6 子項"));
適配器
public class RecyclerViewFoldingAdapter2 extends RecyclerView.Adapter<RecyclerViewFoldingAdapter2.FoldingViewHolder> {
private Context context;
private List<TestBean> list;
public RecyclerViewFoldingAdapter2(Context context, List<TestBean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public RecyclerViewFoldingAdapter2.FoldingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
return new FoldingViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerViewFoldingAdapter2.FoldingViewHolder viewHolder, final int position) {
final TestBean testBean = list.get(position);
if (testBean.isMain()){
viewHolder.textView.setText(testBean.getId() + " " + testBean.getTitle());
if (testBean.isHasChild()){
viewHolder.imageView.setVisibility(View.VISIBLE);
if (testBean.isFolding()){
viewHolder.imageView.setImageResource(R.drawable.down);
} else {
viewHolder.imageView.setImageResource(R.drawable.up);
}
} else {
viewHolder.imageView.setVisibility(View.GONE);
}
} else {
viewHolder.textView.setText(" " + testBean.getTitle());
viewHolder.imageView.setVisibility(View.GONE);
}
viewHolder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testBean.setFolding(!testBean.isFolding());
changeItem(position, testBean.isFolding());
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return list.size();
}
private void changeItem(int index, boolean isFold){
TestBean bean = list.get(index);
if (isFold){
list.removeAll(bean.getBeans());
} else {
list.addAll(index + 1, bean.getBeans());
}
notifyDataSetChanged();
}
static class FoldingViewHolder extends RecyclerView.ViewHolder{
TextView textView;
ImageView imageView;
public FoldingViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv);
imageView = itemView.findViewById(R.id.iv);
}
}
}
以上代碼只是實現(xiàn)效果,未做優(yōu)化各聘,只是提供這個實現(xiàn)思路而已揣非,如需使用請同學(xué)自行優(yōu)化代碼
碼云 ---->>> https://gitee.com/woslxm_limeng/fold_recyclerview.git