写点什么

android 三级级联筛选列表

用户头像
Android架构
关注
发布于: 2021 年 11 月 07 日

实现的思路:左边这个是 listView ,右边是两级的 expandListView?


将这两个 view 动态放到 viewpager 里面 设置好比例,剩下的就是处理点击联动事件了。


大体代码如下:


activity 中 放 viewpager 的 xml


<LinearLayout


android:id="@+id/category_ll"


android:layout_width="match_parent"


android:layout_height="wrap_content"


android:layout_above="@+id/button_ll"


android:layout_below="@+id/title_ll"


android:orientation="vertical"


android:visibility="gone">


<com.jky.mobile_gczjjc.widget.MyViewPager


android:id="@+id/category_viewpager"


android:layout_width="match_parent"


android:layout_height="match_parent"


android:overScrollMode="never" />


</LinearLayout>


target_first_parger.xml


<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:layout_width="match_parent"


android:layout_height="match_parent"


android:background="@color/target_divider_color"


android:orientation="vertical">


<ListView


android:id="@+id/target_first_lv"


android:layout_width="fill_parent"


android:layout_height="fill_parent"


android:background="@color/white"


android:cacheColorHint="@android:color/transparent"


android:divider="@null"


android:scrollbars="none" />


</LinearLayout>


target_second_parger.xml


<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:layout_width="match_parent"


android:layout_height="match_parent"


android:background="@color/target_divider_color"


android:orientation="vertical">


<ExpandableListView


android:id="@+id/target_second_exl"


android:layout_width="fill_parent"


android:layout_height="fill_parent"


android:background="@color/white"


android:cacheColorHint="@android:color/transparent"


android:divider="@null"


android:groupIndicator="@null"


android:scrollbars="none" />


</LinearLayout>


activity 中 核心代码


//一级


mViewPager = findViewById(R.id.category_viewpager);


LayoutInflater inflater = LayoutInflater.from(this);


view1 = inflater.inflate(R.layout.target_first_parger, null);


view2 = inflater.inflate(R.layout.target_second_parger, null);


mFirstListView = view1.findViewById(R.id.target_first_lv);


mSecondListView = view2.findViewById(R.id.target_second_exl);


mFirstAdapter = new TargetCategoryFirstAdapter(this, firstBeans);


mFirstAdapter.setSelectedBackgroundResource(R.drawable.select_white);//选中时


mFirstAdapter.setHasDivider(false);


mFirstAdapter.setNormalBackgroundResource(R.color.target_bg_gray);//未选中


mFirstListView.setAdapter(mFirstAdapter);


views.add(view1);


views.add(view2);//加载了一二级菜单


mViewPager.setAdapter(new MyPagerAdapter(views));


初始化数据及点击事件部分


private void initSelectCategory(CategoryBean bean) {


if (bean != null && bean.getData() != null) {


firstBeans = bean.getData();


}


FirstBean fBean = new FirstBean();


fBean.setName("全部");


fBean.setType("0");


fBean.setItems(new ArrayList<SecondBean>());


fBean.setSelect(true);


firstBeans.add(0, fBean);


if (mFirstAdapter == null) {


mFirstAdapter = new TargetCategoryFirstAdapter(TargetFilterActivity.this, firstBeans);


mSecondListView.setAdapter(mSecondAdapter);


} else {


mFirstAdapter.setData(firstBeans);


}


mFirstListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {


@Override


public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


FirstBean firstBean = firstBeans.get(position);


for (int i = 0; i < firstBeans.size(); i++) {


if (i == position) {


firstBeans.get(i).setSelect(true);


} else {


firstBeans.get(i).setSelect(false);


}


}


if (mFirstAdapter == null) {


mFirstAdapter = new TargetCategoryFirstAdapter(TargetFilterActivity.this, firstBeans);


mSecondListView.setAdapter(mSecondAdapter);


} else {


mFirstAdapter.setData(firstBeans);


}


if (firstBean.getType().equals("0")) {//不限


if (mSecondAdapter != null) {


mSecondAdapter.setData(new ArrayList<SecondBean>());


mSecondAdapter.notifyDataSetChanged();


}


} else {


mSecondList = firstBean.getItems();


for (int i = 0; i < mSecondList.size(); i++) {


mSecondList.get(i).setIsSelect(false);


for (int j = 0; j < mSecondList.get(i).getItems().size(); j++) {


mSecondList.get(i).getItems().get(j).setIsSelect(false);


}


}


if (mSecondAdapter == null) {


mSecondAdapter = new TargetCategorySecondAdapter(TargetFilterActivity.this, mSecondList);


mSecondListView.setAdapter(mSecondAdapter);


} else {


mSecondAdapter.setData(mSecondList);


}


String secondType = firstBean.getType();


String secondName = firstBean.getName();


if (secondType.equals("-1")) {


mProjectType = mFirstProjectType;


mProjectTypeName = mFirstProjectTypeName;


} else {


mProjectType = mFirstProjectType + "/" + secondType;


mProjectTypeName = mFirstProjectTypeName + "/" + secondName;


}


//默认全部展开


for (int i = 0; i < mSecondList.size(); i++) {


if (mSecondListView != null) {


mSecondListView.expandGroup(i);


}


}


}


}


});


//二级


mSecondListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {


@Override


public boolean onGroupClick(ExpandableListView expandableListView, View view, int groupPosition, long l) {


for (int i = 0; i < mSecondList.size(); i++) {


if (i == groupPosition) {


mSecondList.get(i).setIsSelect(true);


} else {


mSecondList.get(i).setIsSelect(false);


}


for (int j = 0; j < mSecondList.get(i).getItems().size(); j++) {


mSecondList.get(i).getItems().get(j).setIsSelect(false);


}


}


String thirdType = mSecondList.get(groupPosition).getType();


String thirdName = mSecondList.get(groupPosition).getName();


mProjectType = mFirstProjectType + "/" + thirdType;


mProjectTypeName = mFirstProjectTypeName + "/" + thirdName;


mSecondAdapter.setData(mSecondList);


return true;


}


});


mSecondListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {


@Override


public boolean onChildClick(ExpandableListView expandableListView, View view, int groupPosition, int childPosition, long l) {


for (int i = 0; i < mSecondList.size(); i++) {


if (i == groupPosition) {


mSecondList.get(i).setIsSelect(true);


} else {


mSecondList.get(i).setIsSelect(false);


}


List<SecondBean.ThirdBean> thirdList = mSecondList.get(i).getItems();


for (int j = 0; j < thirdList.size(); j++) {


if (i == groupPosition && j == childPosition) {


thirdList.get(j).setIsSelect(true);


} else {


thirdList.get(j).setIsSelect(false);


}


}


}


String thirdType = mSecondList.get(groupPosition).getType();


String thirdName = mSecondList.get(groupPosition).getName();


String fourType = mSecondList.get(groupPosition).getItems().get(childPosition).getType();


String fourName = mSecondList.get(groupPosition).getItems().get(childPosition).getName();


mProjectType = mFirstProjectType + "/" + thirdType + "/" + fourType;//工程类型 id


mProjectTypeName = mFirstProjectTypeName + "/" + thirdName + "/" + fourName;//工程名称 前端显示


mSecondAdapter.setData(mSeco


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


ndList);


return false;


}


});


}


MyViewPager


package com.jky.mobile_gczjjc.widget;


import android.content.Context;


import android.support.v4.view.ViewPager;


import android.util.AttributeSet;


/**


  • Created by LaiYingtang on 2016/5/22.

  • 主页面左右滑动


*/


public class MyViewPager extends ViewPager {


public MyViewPager(Context context, AttributeSet attrs) {


super(context, attrs);


}


public MyViewPager(Context context) {


super(context);


}


//判断 menu 在 x,y 的位置


public void scrollTo(int x,int y){


if(getAdapter()==null||x>getWidth()*(getAdapter().getCount()-2)){


return;


}


super.scrollTo(x,y);


}


}


TargetCategoryFirstAdapter


package com.jky.mobile_gczjjc.adapter;


import android.content.Context;


import android.graphics.Color;


import android.view.LayoutInflater;


import android.view.View;


import android.view.ViewGroup;


import android.widget.BaseAdapter;


import android.widget.TextView;


import com.jky.mobile_gczjjc.R;


import com.jky.mobile_gczjjc.bean.CategoryBean.FirstBean;


import java.util.ArrayList;


import java.util.List;


/**


  • 指标 建筑分类 第一级适配器

  • @author zlw


*/


public class TargetCategoryFirstAdapter extends BaseAdapter {


private Context mContext;


private List<FirstBean> firstBeans =new ArrayList<>();


private int mSelectedBackgroundResource;//选中 item 时的背景颜色


private int mNormalBackgroundResource;//为选中的背景颜色


private boolean hasDivider = true;


public void setSelectedBackgroundResource(int mSelectedBackgroundResource) {


this.mSelectedBackgroundResource = mSelectedBackgroundResource;


}


public void setNormalBackgroundResource(int mNormalBackgroundResource) {


this.mNormalBackgroundResource = mNormalBackgroundResource;


}


public void setHasDivider(boolean hasDivider) {


this.hasDivider = hasDivider;


}


public TargetCategoryFirstAdapter(Context mContext, List<FirstBean> firstBeans) {


this.mContext = mContext;


this.firstBeans = firstBeans;


}


public void setData(List<FirstBean> data) {


this.firstBeans = data;


notifyDataSetChanged();


}


@Override


public int getCount() {


if (firstBeans == null) {


return 0;


}


return firstBeans.size();


}


@Override


public Object getItem(int position) {


if (firstBeans == null) {


return null;


}


return firstBeans.get(position);


}


@Override


public long getItemId(int position) {


return position;


}


@Override


public View getView(int position, View convertView, ViewGroup parent) {


ViewHolder vh = null;


if (convertView == null) {


vh = new ViewHolder();


convertView = LayoutInflater.from(mContext).inflate(R.layout.item_target_category_first, null);


vh.itemLayout = convertView.findViewById(R.id.menu_item_ly);


vh.nameText = convertView.findViewById(R.id.name_rb);


vh.dividerTextView = convertView.findViewById(R.id.menu_item_divider);


convertView.setTag(vh);


} else {


vh = (ViewHolder) convertView.getTag();


}


FirstBean firstBean = firstBeans.get(position);


vh.nameText.setText(firstBean.getName());//设置标题


if (firstBean.isSelect){


vh.nameText.setTextColor(mContext.getResources().getColor(R.color.common_blue));


vh.itemLayout.setBackgroundResource(mSelectedBackgroundResource);


}else{


vh.nameText.setTextColor(Color.BLACK);


vh.itemLayout.setBackgroundResource(mNormalBackgroundResource);


}


//隐藏 view


vh.dividerTextView.setVisibility(hasDivider ? View.VISIBLE : View.INVISIBLE);


return convertView;


}


private class ViewHolder{


private View itemLayout;


private TextView nameText;


private TextView dividerTextView;


}


}


TargetCateGorySecondAdapter


package com.jky.mobile_gczjjc.adapter;


import android.content.Context;


import android.view.LayoutInflater;


import android.view.View;


import android.view.ViewGroup;


import android.widget.BaseExpandableListAdapter;


import android.widget.TextView;


import com.jky.mobile_gczjjc.R;


import com.jky.mobile_gczjjc.bean.CategoryBean.FirstBean.SecondBean;


import com.jky.mobile_gczjjc.bean.CategoryBean.FirstBean.SecondBean.ThirdBean;


import java.util.ArrayList;


import java.util.List;


/**


  • 指标 建筑分类 第二级适配器

  • @author zlw


*/


public class TargetCategorySecondAdapter extends BaseExpandableListAdapter {


private Context mContext;


private List<SecondBean> secondBeans= new ArrayList<>();


private int selectedPos = -1;


public TargetCategorySecondAdapter(Context mContext, List<SecondBean> menuDatas) {


this.mContext = mContext;


this.secondBeans = menuDatas;


}


//选中的 position,及时更新数据


public void setSelectedPos(int selectedPos) {


this.selectedPos = selectedPos;


notifyDataSetChanged();


}


public void setData(List<SecondBean> data) {


this.secondBeans = data;


notifyDataSetChanged();


}


@Override


public int getGroupCount() {


return secondBeans.size();


}


@Override


public int getChildrenCount(int groupPosition) {


return secondBeans.get(groupPosition).getItems().size();


}


@Override


public Object getGroup(int groupPosition) {


return secondBeans.get(groupPosition);


}


@Override


public Object getChild(int groupPosition, int childPosition) {


return secondBeans.get(groupPosition).getItems().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 true;


}


@Override


public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {


ViewHolder vh = null;


if (convertView == null) {


vh = new ViewHolder();


convertView = LayoutInflater.from(mContext).inflate(R.layout.item_target_category_second, null);


vh.menu_item_ly = convertView.findViewById(R.id.menu_item_ly);


vh.nameText = convertView.findViewById(R.id.name_rb);


convertView.setTag(vh);


} else {


vh = (ViewHolder) convertView.getTag();


}


SecondBean secondBean = secondBeans.get(groupPosition);


if (secondBean.isSelect){


vh.nameText.setTextColor(mContext.getResources().getColor(R.color.red_text_color));


}else{


vh.nameText.setTextColor(mContext.getResources().getColor(R.color.gray_text_color));


}


vh.nameText.setText(secondBean.getName());//设置标题


return convertView;


}


@Override

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
android 三级级联筛选列表