近日产品提出一个要一个三级菜单列表的功能,网上也一些资源,但是并不能满足需求。有4种实现思路:
(1)最常见的是两个expandlistview相互嵌套,亲身检测,比较繁琐,代码也不够简洁,而且会有三级惨淡测绘高度失效的情况.
(2)使用一个recycleview,自己来维护数据集合,亲测,这种方式两层的数据格式时,还是可以接受的,但是三层的时候,维护数据的复杂度就不是一个量级,比较复杂。
(3)使用3个recycleview嵌套,数据维持就相对简单,只要处理recycleview的测绘高度冲突即可,网上有很多,这里不多说。
(4)这是我实现的方式,自认为这种实现方式是比较简单且清晰的,两个控件嵌套,expandlistview和recycleview嵌套,童谣要处理好recycleview子类item项的高度测绘问题(这也是我的实现方式)
代码如下:
activity中的代码------------
public class MainActivity extends AppCompatActivity { private List<BeanData> mBeanDataList = new ArrayList<>(); Context mContext; ExpandableListView mExpandableListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; initData(); mExpandableListView = findViewById(R.id.expandableListView); mExpandableListView.setAdapter(new Myadapter(mContext, mBeanDataList)); } /** * 初始化数据集合 */ private void initData() { for (int i = 0; i < 5; i++) { BeanData beanData = new BeanData(); beanData.setContent("parent" + i); List<BeanData> beanDataList = new ArrayList<>(); for (int j = 0; j < 5; j++) { BeanData beanData1 = new BeanData(); beanData1.setContent("child" + j); List<BeanData> beanDataList1 = new ArrayList<>(); for (int k = 0; k < 5; k++) { BeanData beanData2 = new BeanData(); beanData2.setContent("secondChild" + k); beanData2.setBeanData(new ArrayList<BeanData>()); beanDataList1.add(beanData2); } beanData1.setBeanData(beanDataList1); beanDataList.add(beanData1); } beanData.setBeanData(beanDataList); mBeanDataList.add(beanData); } } }布局的话就是一个expandlistview控件,就不贴了
一个实体类如下:
public class BeanData { private List<BeanData> mBeanData; private String content; public List<BeanData> getBeanData() { return mBeanData; } public void setBeanData(List<BeanData> beanData) { mBeanData = beanData; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }两个adapter 代码如下:
public class Myadapter extends BaseExpandableListAdapter { Context mContext; List<BeanData> list; public Myadapter(Context context, List<BeanData> list) { mContext = context; this.list = list; } @Override public int getGroupCount() { return list.size(); } @Override public int getChildrenCount(int groupPosition) { return list.get(groupPosition).getBeanData().size(); } @Override public Object getGroup(int groupPosition) { return list.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return list.get(groupPosition).getBeanData().get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { parentViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.parent_item_layout, parent, false); holder = new parentViewHolder(); holder.parent_tv = convertView.findViewById(R.id.partent); convertView.setTag(holder); } else { holder = (parentViewHolder) convertView.getTag(); } holder.parent_tv.setText(list.get(groupPosition).getContent()); return convertView; } class parentViewHolder { TextView parent_tv; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final childViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.child_item_layout, parent, false); holder = new childViewHolder(); holder.child_tv = convertView.findViewById(R.id.partent1); holder.child_tv.setTag(false); holder.mAllHeightRecyclerView = convertView.findViewById(R.id.recyclerView); holder.mAllHeightRecyclerView.setLayoutManager(new LinearLayoutManager(parent.getContext())); convertView.setTag(holder); } else { holder = (childViewHolder) convertView.getTag(); } recyclerAdapter recyclerAdapter = new recyclerAdapter(list.get(groupPosition).getBeanData().get(childPosition).getBeanData()); holder.mAllHeightRecyclerView.setAdapter(recyclerAdapter); holder.child_tv.setText(list.get(groupPosition).getBeanData().get(childPosition).getContent()); holder.child_tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isShow = (boolean) v.getTag(); holder.mAllHeightRecyclerView.setVisibility(!isShow ? View.VISIBLE : View.GONE); v.setTag(!isShow); } }); return convertView; } class childViewHolder { TextView child_tv; AllHeightRecyclerView mAllHeightRecyclerView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } }
public class recyclerAdapter extends RecyclerView.Adapter<recyclerAdapter.RecyViewHolder> { private List<BeanData> mBeanDataList; private OnItemClickListener mOnItemClickListener; /** * Created by joker on 2018/1/10. */ public interface OnItemClickListener { void onClick(int position, ShowData showData); } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { mOnItemClickListener = onItemClickListener; } public recyclerAdapter(List<BeanData> beanDataList) { mBeanDataList = beanDataList; } @Override public recyclerAdapter.RecyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { TextView textView = new TextView(parent.getContext()); return new RecyViewHolder(textView); } @Override public void onBindViewHolder(recyclerAdapter.RecyViewHolder holder, int position) { holder.mTextView.setText(mBeanDataList.get(position).getContent()); } @Override public int getItemCount() { return mBeanDataList.size(); } class RecyViewHolder extends RecyclerView.ViewHolder { private TextView mTextView; RecyViewHolder(TextView itemView) { super(itemView); mTextView = itemView; } } }
这里是一个强行测绘的recycleview:
/** * Created by jp on 2017/9/11. * 重新测量recyclerview高度,强制绘制全部高度 */ public class AllHeightRecyclerView extends RecyclerView { public AllHeightRecyclerView(Context context) { super(context); } public AllHeightRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public AllHeightRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthSpec, int heightSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthSpec, expandSpec); } }三个列表布局中,需要注意的就是二级列表的布局了,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/partent1" android:layout_width="match_parent" android:layout_height="wrap_content"/> <com.joker.threelevelslist.AllHeightRecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone"/> </LinearLayout>这个样完美完成三级列表的功能了
522



被折叠的 条评论
为什么被折叠?



